Simptomi
Pretpostavimo da stvorite grupu dostupnosti pomoću uvjeta WITH DTC_SUPPORT = PER_DB u programu Microsoft SQL Server. Kada pokušate izvršiti naredbu SAVE TRANSACTION u transakcijama ili pohranjenim postupcima sustava kao što su sp_executesql, primit ćete jednu od sljedećih poruka o pogrešci:
Msg 627, razina 16, stanje 0, Line LineNumber
Spremanje transakcije nije moguće koristiti unutar distribuirane transakcije.
Msg 12324, Razina 16, Stanje 100, Line LineNumber
Distribuirane transakcije (DTC) nisu podržane s tablicama optimiziranima za memoriju.
Pogreška: 3933, ozbiljnost problema: 16, stanje: 1.
Transakciju nije moguće promovirati u raspodijeljenu transakciju jer u ovoj transakciji postoji aktivna točka spremanja.
Uzrok
Kada je baza podataka u grupi Uvijek na dostupnosti omogućena za WITH DTC_SUPPORT = PER_DB, sve dok transakcija obuhvaća više baza podataka, transakcija se promovira u MSDTC transakciju u SQL Server 2016 SP2 i SQL Server 2017. Postoje ograničenja u MSDTC transakcijama, na primjer, točke spremanja ne mogu se koristiti, memorijski optimizirane tablice se ne mogu koristiti.
U nekim situacijama unakrsne transakcije baze podataka ne događaju se jer korisnici imaju transakcije koje obuhvaćaju dvije korisničke baze podataka, već zato što transakcije obuhvaćaju trenutnu bazu podataka i baze podataka sustava (matrica, tempdb, model, baza podataka resursa sustava). Budući da je baza podataka resursa sustava zapravo samo za čitanje, nije potrebno promovirati u MSDTC transakciju ako transakcija s više baza podataka uključuje bazu podataka resursa sustava, ali ne i druge baze podataka sustava.
Rješenje
Popravak uveden u ovom KB preskače promociju na MSDTC transakciju ako su baza podataka resursa sustava i korisnička baza podataka koja je dio grupe dostupnosti omogućena za PER_DB DTC uključeni u transakciju više baza podataka unutar iste instance SQL Server-a.
Stoga ako je izvorni uzrok gore navedenih pogrešaka unakrsna transakcija baze podataka koja uključuje bazu podataka resursa sustava, taj će se popravak riješiti. Ponekad se korisniku mogu prikazati gore navedene pogreške s istim temeljnim uzrokom. U nastavku su navedeni uvjeti pod kojima se primjenjuje ovaj popravak:
-
Baza podataka dio je grupe uvijek na dostupnosti omogućene uz DTC_SUPPORT = PER_DB.
-
Transakcija u više baza podataka obuhvaća tu bazu podataka i bazu podataka resursa sustava u istoj SQL Server instanci.
-
Unutar transakcije u više baza podataka koristi se FUNKCIJA SAVE TRANSACTION ili su uključene tablice optimizirane za memoriju.
Takva transakcija ne bi uspijevala s gore navedenim pogreškama bez ovog popravka. Uz ovaj popravak, takva transakcija treba nastaviti.
Napomena: ovaj popravak rješava transakcije u više baza podataka koje obuhvaćaju bazu podataka resursa sustava, ali sve transakcije u više baza podataka koje uključuju korisničke baze podataka i sadrže naredbu SAVE TRANSACTION i dalje neće uspjeti i moraju se ponovno napisati.
Taj je problem riješen u sljedećem kumulativnom ažuriranju za SQL Server:
Svako novo kumulativno ažuriranje za SQL Server sadrži sve hitne popravke i sve sigurnosne popravke koji su obuhvaćeni prethodnim kumulativnim ažuriranjem. Pogledajte najnovija kumulativna ažuriranja za SQL Server:
Dodatne informacije
Dodatne informacije o DTC_SUPPORT = PER_DB, tablicama optimiziranima za memoriju, SAVE TRANSACTION možete pronaći na sljedećim vezama.
Transakcije baze podataka unutar iste instance SQL Server povezati ovaj dio 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
tablice optimizirane za memoriju odnose ovaj dio na https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations SPREMI
TRANSAKCIJU povežite ovaj dio s https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Status
Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku "Odnosi se na".
Reference
Saznajte više o terminologiji koju Microsoft koristi za opisivanje softverskih ažuriranja.