Problembeschreibung
Gehen Sie davon aus, dass Sie eine Verfügbarkeitsgruppe mithilfe der WITH DTC_SUPPORT = PER_DB-Klausel in Microsoft SQL Server erstellen. Wenn Sie versuchen, eine SAVE TRANSACTION-Anweisung in einer transaktions- oder systemgespeicherten Prozedur wie sp_executesql auszuführen, wird eine der folgenden Fehlermeldungen angezeigt:
Msg 627, Level 16, State 0, Line LineNumber
SAVE TRANSACTION kann nicht in einer verteilten Transaktion verwendet werden.
Msg 12324, Level 16, State 100, Line LineNumber
Verteilte Transaktionen (DTC) werden bei speicheroptimierter Tabellen nicht unterstützt.
Fehler: 3933, Schweregrad: 16, Zustand: 1.
Die Transaktion kann nicht zu einer verteilten Transaktion heraufgestuft werden, da in dieser Transaktion ein aktiver Speicherpunkt vorhanden ist.
Ursache
Wenn eine Datenbank in Always On Verfügbarkeitsgruppe für WITH DTC_SUPPORT = PER_DB aktiviert ist, solange eine Transaktion mehrere Datenbanken umfasst, wird die Transaktion in SQL Server 2016 SP2 und SQL Server 2017 zu MSDTC-Transaktion heraufgestuft. Es gibt Einschränkungen bei MSDTC-Transaktionen, z. B. können keine Speicherpunkte verwendet werden, speicheroptimierte Tabellen können nicht verwendet werden.
In einigen Situationen erfolgen datenbankübergreifende Transaktionen nicht, weil Benutzer Transaktionen mit zwei Benutzerdatenbanken haben, sondern weil die Transaktionen die aktuelle Datenbank und Systemdatenbanken (Master, Tempdb, Modell, Systemressourcendatenbank) betreffen. Da die Systemressourcendatenbank tatsächlich schreibgeschützt ist, ist es nicht erforderlich, die MSDTC-Transaktion höher zu stufen, wenn eine datenbankübergreifende Transaktion eine Systemressourcendatenbank, aber keine anderen Systemdatenbanken umfasst.
Lösung
Der in diesem KB eingeführte Fix überspringt die Heraufstufung zu MSDTC-Transaktion, wenn die Systemressourcendatenbank und eine Benutzerdatenbank, die Teil einer Verfügbarkeitsgruppe ist, die für PER_DB DTC aktiviert ist, an einer datenbankübergreifenden Transaktion innerhalb derselben SQL Server Instanz beteiligt sind.
Wenn es sich bei der ursprünglichen Fehlerursache, die oben aufgeführt ist, um eine datenbankübergreifende Transaktion handelt, die die Systemressourcendatenbank einbezieht, wird diese Lösung behoben. Manchmal sehen Benutzer möglicherweise die oben aufgeführten Fehler mit derselben zugrunde liegenden Ursache. Im Folgenden sind die Bedingungen aufgeführt, unter denen dieser Fix angewendet wird:
-
Eine Datenbank ist Teil einer Always On Verfügbarkeitsgruppe, die MIT DTC_SUPPORT = PER_DB aktiviert ist.
-
Eine datenbankübergreifende Transaktion umfasst diese Datenbank und die Systemressourcendatenbank in derselben SQL Server Instanz.
-
Innerhalb der datenbankübergreifenden Transaktion wird SAVE TRANSACTION verwendet, oder speicheroptimierte Tabellen sind beteiligt.
Eine solche Transaktion würde bei oben aufgeführten Fehlern ohne diesen Fix fehlschlagen. Mit diesem Fix sollte eine solche Transaktion fortgesetzt werden.
Hinweis: Dieser Fix behebt datenbankübergreifende Transaktionen, die die Systemressourcendatenbank betreffen, aber jede datenbankübergreifende Transaktion, die Benutzerdatenbanken umfasst und eine SAVE TRANSACTION-Anweisung enthält, schlägt weiterhin fehl und muss neu geschrieben werden.
Dieses Problem wurde im folgenden kumulativen Update für SQL Server behoben:
Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und alle Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:
Weitere Informationen
Weitere Informationen zu DTC_SUPPORT = PER_DB, speicheroptimierter Tabellen, SAVE TRANSACTION finden Sie unter den folgenden Links.
Datenbanktransaktionen innerhalb derselben SQL Server Instanz verknüpfen diesen Teil mit 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
speicheroptimierte Tabellen verknüpfen diesen Teil mit
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitationsTRANSAKTION SPEICHERN verknüpfen Sie diesen Teil mit https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarks
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.
Informationsquellen
Erfahren Sie mehr über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.