Síntomas
Suponga que crea un grupo de disponibilidad mediante la cláusula WITH DTC_SUPPORT = PER_DB en Microsoft SQL Server. Cuando intenta ejecutar una instrucción SAVE TRANSACTION en una transacción o procedimientos almacenados del sistema como sp_executesql, recibe uno de los siguientes mensajes de error:
Msg 627, Level 16, State 0, LineNumber
No puede usar GUARDAR TRANSACCIÓN dentro de una transacción distribuida.
Msg 12324, Nivel 16, Estado 100, LineNumber
Las transacciones distribuidas (DTC) no son compatibles con tablas optimizadas para memoria.
Error: 3933, Gravedad: 16, Estado: 1.
No se puede promover la transacción a una transacción distribuida porque hay un punto de almacenamiento activo en esta transacción.
Causa
Cuando se habilita una base de datos en Always On grupo de disponibilidad para WITH DTC_SUPPORT = PER_DB, siempre que una transacción implique varias bases de datos, la transacción se promueve a transacción MSDTC en SQL Server 2016 SP2 y SQL Server 2017. Hay limitaciones en las transacciones MSDTC, por ejemplo, los puntos de almacenamiento no se pueden utilizar, las tablas optimizadas para memoria no se pueden utilizar.
En algunas situaciones, las transacciones entre bases de datos no se producen porque los usuarios tienen transacciones que implican a dos bases de datos de usuario, sino porque las transacciones implican la base de datos actual y las bases de datos del sistema (master, tempdb, modelo, base de datos de recursos del sistema). Dado que la base de datos de recursos del sistema es realmente de solo lectura, no es necesario promover a transacción MSDTC si una transacción de base de datos cruzada implica la base de datos de recursos del sistema, pero no otras bases de datos del sistema.
Solución
La corrección introducida en este ARTÍCULO omite la promoción a la transacción MSDTC si la base de datos de recursos del sistema y una base de datos de usuarios que forma parte de un grupo de disponibilidad habilitado para PER_DB DTC están implicados en una transacción de base de datos cruzada dentro de la misma SQL Server instancia.
Por lo tanto, si la causa original de los errores enumerados anteriormente es la transacción cruzada de la base de datos que implica la base de datos de recursos del sistema, esta corrección lo abordará. A veces, es posible que el usuario vea los errores enumerados anteriormente con la misma causa subyacente. A continuación se enumeran las condiciones en las que se aplica esta corrección:
-
Una base de datos forma parte de un grupo de disponibilidad Always On habilitado WITH DTC_SUPPORT = PER_DB.
-
Una transacción de base de datos cruzada implica esta base de datos y la base de datos de recursos del sistema en la misma SQL Server instancia.
-
Dentro de la transacción entre bases de datos, se usa GUARDAR TRANSACCIÓN o se usan tablas optimizadas para memoria.
Dicha transacción produciría un error con los errores enumerados anteriormente sin esta corrección. Con esta corrección, dicha transacción debería proceder.
Nota: Esta corrección corrige las transacciones entre bases de datos que implican la base de datos de recursos del sistema, pero cualquier transacción entre bases de datos que implique bases de datos de usuario y contenga una instrucción SAVE TRANSACTION seguirá teniendo errores y debe volver a escribirse.
Este problema se ha corregido en la siguiente actualización acumulativa para SQL Server:
Cada nueva actualización acumulativa de SQL Server contiene todas las revisiones y todas las correcciones de seguridad que se incluyeron con la actualización acumulativa anterior. Echa un vistazo a las últimas actualizaciones acumulativas de SQL Server:
Más información
Puede encontrar información adicional sobre DTC_SUPPORT = PER_DB, tablas optimizadas para memoria, SAVE TRANSACTION en los siguientes vínculos.
Las transacciones de base de datos en la misma instancia SQL Server vinculan esta parte a 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
las tablas optimizadas para memoria vinculan esta parte a
https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/transactions-with-memory-optimized-tables?view=sql-server-2017#limitations vincular esta parte a la https://learn.microsoft.com/en-us/sql/t-sql/language-elements/save-transaction-transact-sql?view=sql-server-2017#remarksGUARDAR TRANSACCIÓN
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "Se aplica a".
Referencias
Obtén información sobre la terminología que Microsoft usa para describir las actualizaciones de software.