KB4092554 - CORRECCIÓN: Los errores 627 o 12324 se producen cuando las transacciones entre bases de datos se promueven a transacciones distribuidas en SQL Server grupo de disponibilidad

Se aplica a
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

Síntomas

Supongamos 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 por el sistema, como sp_executesql, recibe uno de los mensajes de error siguientes:

Nota

Msj 627, Nivel 16, Estado 0, Número de línea
No se puede usar SAVE TRANSACTION dentro de una transacción distribuida.
Msj 12324, Nivel 16, Estado 100, Número de línea
Las transacciones distribuidas (DTC) no son compatibles con las 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 una base de datos del grupo de disponibilidad Always On está habilitada para WITH DTC_SUPPORT = PER_DB, siempre que una transacción implique varias bases de datos, la transacción se promueve a la transacción MSDTC en SQL Server 2016 SP2 y SQL Server 2017. Existen limitaciones en las transacciones MSDTC, por ejemplo, no se pueden usar puntos de guardado, no se pueden usar tablas optimizadas para memoria.

En algunas situaciones, las transacciones entre bases de datos no se producen porque los usuarios tengan transacciones relacionadas con 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, model, system resource database). Dado que la base de datos de recursos del sistema es de solo lectura, no es necesario promover a la transacción MSDTC si una transacción entre bases de datos implica la base de datos de recursos del sistema, pero no otras bases de datos del sistema.

Resolución

La corrección introducida en este KB omite la promoción a la transacción MSDTC si la base de datos de recursos del sistema y una base de datos de usuario que forma parte de un grupo de disponibilidad habilitado para PER_DB DTC están implicadas en una transacción entre bases de datos dentro de la misma instancia SQL Server.

Por lo tanto, si la causa original de los errores enumerados anteriormente es una transacción entre bases de datos que implica la base de datos de recursos del sistema, esta corrección lo solucionará. 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 CON DTC_SUPPORT = PER_DB.
  • Una transacción entre bases de datos implica esta base de datos y la base de datos de recursos del sistema en la misma instancia de SQL Server.
  • Dentro de la transacción entre bases de datos, se utiliza GUARDAR TRANSACCIÓN, o hay tablas optimizadas para memoria implicadas.

Dicha transacción produciría los errores enumerados anteriormente sin esta corrección. Con esta corrección, dicha transacción debe continuar.

Nota: Esta corrección aborda 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á fallando y deberá volver a escribirse.

Este problema se corrige en la siguiente actualización acumulativa para SQL Server:

Acerca de las actualizaciones acumulativas para SQL Server:

Cada nueva actualización acumulativa para SQL Server contiene todas las revisiones y correcciones de seguridad que se incluyeron con la actualización acumulativa anterior. Consulte las actualizaciones acumulativas más recientes para SQL Server:

Más información

Información adicional sobre DTC_SUPPORT = PER_DB, tablas optimizadas para memoria y GUARDAR TRANSACCIÓN se puede encontrar en los siguientes vínculos.

Las transacciones de base de datos dentro de la misma instancia de 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
Tablas optimizadas para memoria Vincular 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
GUARDAR TRANSACCIÓN Vincular esta parte a 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

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Referencias

Obtenga información sobre la terminología que usa Microsoft para describir las actualizaciones de software.