KB4092554 – OPRAVA: K chybám 627 nebo 12324 dochází, když jsou transakce mezi databázemi povýšeny na distribuované transakce ve skupině dostupnosti SQL Server

Platí pro
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Standard on Windows

Příznaky

Předpokládejme, že vytvoříte skupinu dostupnosti pomocí klauzule WITH DTC_SUPPORT = PER_DB v Microsoft SQL Server. Při pokusu o provedení příkazu SAVE TRANSACTION v transakci nebo v procedurách uložených v systému, jako je sp_executesql, se zobrazí jedna z následujících chybových zpráv:

Poznámka

Zpráva 627, úroveň 16, stav 0, číslo řádku
Příkaz SAVE TRANSACTION nelze použít v rámci distribuované transakce.
Zpráva 12324, úroveň 16, stav 100, číslo řádku
Distribuované transakce (DTC) nejsou podporovány tabulkami optimalizovanými pro paměť.
Chyba: 3933, Závažnost: 16, Stav: 1.
Nelze zvýšit úroveň transakce na distribuovanou transakci, protože v této transakci existuje aktivní bod uložení.

Příčina

Pokud je u databáze ve skupině dostupnosti Always On povolená hodnota WITH DTC_SUPPORT = PER_DB, tak pokud transakce zahrnuje více databází, v SQL Server 2016 SP2 a SQL Server 2017 se transakce povýší na transakci MSDTC. V transakcích MSDTC existují omezení, například nelze použít body uložení, nelze použít tabulky optimalizované pro paměť.

V některých situacích nedochází k transakcím mezi databázemi proto, že by uživatelé provedli transakce zahrnující dvě uživatelské databáze, ale proto, že transakce zahrnují aktuální databázi a systémové databáze (hlavní, databázi tempdb, modelovou a databázi systémových prostředků). Vzhledem k tomu, že databáze systémových prostředků je ve skutečnosti jen pro čtení, není nutné zvýšit úroveň na transakci MSDTC, pokud transakce mezi databázemi zahrnuje databázi systémových prostředků, ale ne jiné systémové databáze.

Řešení

Oprava zavedená v této aktualizaci KB přeskočí povýšení na transakci MSDTC, pokud databáze systémových prostředků a uživatelská databáze, která je součástí skupiny dostupnosti povolené pro PER_DB DTC, jsou součástí transakce mezi databázemi v rámci stejné instance SQL Server.

Pokud je tedy původní příčinou výše uvedených chyb křížová databázová transakce zahrnující databázi systémových prostředků, tato oprava ji vyřeší. Někdy se uživateli můžou zobrazit výše uvedené chyby se stejnou základní příčinou. Následující seznam obsahuje podmínky, za kterých se tato oprava použije:

  • Databáze je součástí skupiny dostupnosti Always On, která je povolená WITH DTC_SUPPORT = PER_DB.
  • Transakce mezi databázemi zahrnuje tuto databázi a databázi systémových prostředků ve stejné instanci SQL Server.
  • V rámci transakce mezi databázemi se používá příkaz SAVE TRANSACTION nebo se jedná o paměťově optimalizované tabulky.

Bez této opravy by taková transakce selhala s výše uvedenými chybami. Po této opravě by taková transakce měla pokračovat.

Poznámka: Tato oprava řeší transakce mezi databázemi, které zahrnují databázi systémových prostředků, ale všechny transakce mezi databázemi, které zahrnují uživatelské databáze a obsahují příkaz SAVE TRANSACTION , budou přesto neúspěšné a musí se přepsat.

Tento problém je opravený v následující kumulativní aktualizaci pro SQL Server:

Informace o kumulativních aktualizacích pro SQL Server:

Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace pro SQL Server:

Další informace

Další informace o DTC_SUPPORT = PER_DB, tabulkách optimalizovaných pro paměť, SAVE TRANSACTION najdete na následujících odkazech.

Databázové transakce v rámci stejné instance SQL Server spojují tuto část s https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/transactions-always-on-availability-and-database-mirroring?view=sql-server-2017#sql-server-2016-sp1-and-before-support-for-cross-database-transactions-within-the-same-sql-server-instance
Tabulky optimalizované pro paměť propojují tuto část s https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations
SAVE TRANSACTION propojte tuto část s https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks

https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-replication-for-always-on-availability-groups-sql-server?view=sql-server-2017#step2

Stav

Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.

Reference

Přečtěte si o terminologii , kterou společnost Microsoft používá k popisování aktualizací softwaru.