Simptomi
Pieņemsim, ka esat izveidojis pieejamības grupu, izmantojot Microsoft SQL Server klauzulu WITH DTC_SUPPORT = PER_DB . Mēģinot izpildīt priekšrakstu saglabāt transakciju transakciju vai sistēmas saglabāto procedūru , piemēram, sp_executesql,tiek parādīts kāds no šiem kļūdas ziņojumiem:
Msg 627, Level 16, State 0, Line rindas numurs% Nevar izmantot darbību saglabāt dalītā transakcijā. Msg 12324, Level 16, State 100, Line rindas numurs% Dalītā transakciju (DTC) netiek atbalstītas ar atmiņu optimizētām tabulām. Kļūda: 3933, nopietnība: 16, stāvoklis: 1. Nevar paaugstināt transakciju uz dalītu transakciju, jo šajā transakcijā ir aktīvs saglabāšanas punkts.
Cēlonis
Ja datu bāze vienmēr ir iespējota ar DTC_SUPPORT = PER_DB, kamēr transakcija ir saistīta ar vairākām datu bāzēm, transakcija tiek paaugstināta uz MSDTC transakciju SQL Server 2016 SP2 un SQL Server 2017. MSDTC transakcijās ir ierobežojumi, piemēram, saglabāt punktus nevar izmantot, atmiņā optimizētās tabulas nevar izmantot.
Dažos gadījumos starpdatu bāzes transakcijas notiek nevis tāpēc, ka lietotājiem ir transakcijas ar divām lietotāju datu bāzēm, bet tā kā darījumi ietver pašreizējās datu bāzes un sistēmas datu bāzes (šablons, tempdb, modelis, sistēmas resursu datu bāze). Tā kā sistēmas resursu datu bāze faktiski ir tikai lasāma, nav nepieciešams PAAUGSTINĀT MSDTC transakciju, ja krusteniskā datu bāzes transakcija ietver sistēmas resursu datu bāzi, bet ne citas sistēmas datu bāzes.
Risinājums
Labojumi, kas ieviesti šajā KB, pārlec uz MSDTC transakciju, ja sistēmas resursu datu bāze un lietotāja datu bāze, kas ir daļa no pieejamības grupas, kas iespējota PER_DB DTC, ir saistīta ar savstarpējās datu bāzes transakciju vienā un tajā pašā SQL Server instancē.
Tāpēc, ja iepriekš uzskaitīto kļūdu sākotnējais cēlonis ir starpdatu bāzes transakcija, kas ietver sistēmas resursu datu bāzi, šis labojums to adresēs. Dažkārt lietotājs var skatīt iepriekš norādītās kļūdas ar vienu un to pašu pamata iemeslu. Tālāk ir uzskaitīti nosacījumi, kas attiecas uz šo labojumu.
-
Datu bāze ir daļa no pieejamības grupas vienmēr, kas iespējota ar DTC_SUPPORT = PER_DB.
-
Krusteniskā datu bāzes transakcija ir saistīta ar šo datu bāzi un sistēmas resursu datu bāzi tajā pašā SQL Server instancē.
-
Iekšējā datu bāzes transakcijā tiek izmantota SAGLABĀTā TRANSAKCIJA vai ir iesaistīti ar atmiņu optimizētas tabulas.
Šāda transakcija neizdosies ar iepriekš norādītajām kļūdām, neizmantojot šo labojumu. Izmantojot šo labojumu, tālāk ir jāveic šāda darbība.
Piezīme. Šis labojums novērš datu bāzes transakcijas, kas ir saistītas ar sistēmas resursu datu bāzi, bet jebkura datu bāzes transakcija, kas ietver lietotāju datu bāzes un ietver priekšrakstu saglabāt transakciju , joprojām neizdodas un ir jāpārraksta.
Šī problēma ir novērsta šajā SQL Server kumulatīvajā atjauninājumā:
Katrā jaunajā kumulatīvajā SQL Server atjauninājumā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā kumulatīvajā atjauninājumā. Skatiet jaunākos kumulatīvos atjauninājumus SQL Server:
Papildinformācija
Papildu informācija par DTC_SUPPORT = PER_DB, atmiņas optimizētās tabulas, saglabāt transakciju var atrast, izmantojot tālāk norādītās saites.
Datu bāzes transakcijas tajā pašā SQL Server instances saistīt arhttps://docs.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-instanceatmiņu, optimizētās tabulassaista šo elementu ar https://docs.Microsoft.com/en-us/SQL/relational-Databases/in-Memory-OLTP/transactions-with-Memory-Optimized-Tables?View=SQL-Server-2017#limitationssaglabāt transakciju saiti šī daļa uz https://docs.Microsoft.com/en-us/SQL/t-SQL/Language-elements/Save-Transaction-Transact-SQL?View=SQL-Server-2017#remarks
Statusa
Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir norādīti sadaļā "attiecas uz".
Atsauces
Uzziniet par terminoloģiju , ko Microsoft izmanto, lai aprakstītu programmatūras atjauninājumus.