Transacciones - Grupos de disponibilidad y creación de reflejo de la base de datos

Se aplica a:SQL Server

En este artículo se describe la compatibilidad con transacciones entre bases de datos y distribuidas para los grupos de disponibilidad Always On y la duplicación de bases de datos.

Compatibilidad con transacciones distribuidas

SQL Server 2017 admite las transacciones distribuidas de bases de datos en los grupos de disponibilidad. Esto engloba tanto las bases de datos que hay en la misma instancia de SQL Server como las bases de datos en distintas instancias de SQL Server. No se admiten transacciones distribuidas para las bases de datos configuradas para la duplicación de la base de datos.

Nota:

SQL Server 2016 (13.x) Service Pack 2 y versiones posteriores proporcionan compatibilidad total con las transacciones distribuidas en los grupos de disponibilidad.

En las versiones de SQL Server 2016 (13.x) anteriores al Service Pack 2, las transacciones distribuidas entre bases de datos (es decir, las transacciones que usan bases de datos en la misma instancia de SQL Server) que implican una base de datos en un grupo de disponibilidad no son compatibles.

Para configurar un grupo de disponibilidad para transacciones distribuidas, vea Configurar un grupo de disponibilidad para las transacciones distribuidas.

Obtenga más información en:

SQL Server 2016 SP1 y versiones anteriores: compatibilidad con transacciones entre bases de datos en la misma instancia de SQL Server

En SQL Server 2016 SP1 y versiones anteriores, las transacciones entre bases de datos en la misma instancia de SQL Server no son compatibles con los grupos de disponibilidad. La misma instancia de SQL Server no puede hospedar dos bases de datos en una transacción entre bases de datos si una o ambas bases de datos están en un grupo de disponibilidad. Esta limitación también se aplica si esas bases de datos forman parte del mismo grupo de disponibilidad.

Las transacciones entre bases de datos tampoco se admiten para la duplicación de la base de datos.

SQL Server 2016 SP1 y versiones anteriores: compatibilidad con transacciones distribuidas

Las transacciones distribuidas son compatibles con los grupos de disponibilidad si las bases de datos se hospedan en instancias diferentes de SQL Server. También se aplica a las transacciones distribuidas entre las instancias de SQL Server y otro servidor compatible con DTC.

Coordinador de transacciones distribuidas de Microsoft (MSDTC o DTC) es un servicio de Windows que proporciona infraestructura de transacciones para sistemas distribuidos. MSDTC permite que las aplicaciones cliente incluyan varios orígenes de datos en una transacción, que luego se confirma en todos los servidores incluidos en la transacción. Por ejemplo, puede usar MSDTC para coordinar transacciones que abarcan varias bases de datos en servidores diferentes.

SQL Server 2016 ofrece la posibilidad de usar transacciones distribuidas en las que una o varias de las bases de datos de la transacción se encuentran en un grupo de disponibilidad. Antes de SQL Server 2016, no se admitían las transacciones distribuidas para bases de datos de grupos de disponibilidad. SQL Server 2016 puede registrar un administrador de recursos por base de datos. Esta nueva funcionalidad es la razón por la que las transacciones distribuidas pueden incluir bases de datos de grupos de disponibilidad.

Se deben cumplir los requisitos siguientes:

  • Los grupos de disponibilidad deben ejecutarse en Windows Server 2012 R2 o en una versión posterior. Para Windows Server 2012 R2, debe instalar la actualización de KB3090973.

  • Los grupos de disponibilidad se deben crear con el CREATE AVAILABILITY GROUP comando y la cláusula WITH DTC_SUPPORT = PER_DB . Actualmente no se puede modificar un grupo de disponibilidad existente.

  • Todas las instancias de SQL Server que participan en el grupo de disponibilidad deben ser de SQL Server 2016 o posterior.

Falta de compatibilidad con las transacciones distribuidas

Los casos concretos en que no se admiten transacciones distribuidas incluyen:

  • En SQL Server 2016 SP1 y versiones anteriores, si hay más de una base de datos implicada en la transacción en el mismo grupo de disponibilidad.

  • En SQL Server 2016 SP1 y versiones anteriores, si al menos una base de datos se encuentra en un grupo de disponibilidad y otra base de datos se encuentra en la misma instancia de SQL Server.

  • Si el grupo de disponibilidad no se ha creado con la transacción distribuida habilitada.

  • Duplicación de la base de datos.

Importante

Determine cuál es el resultado predeterminado adecuado de las transacciones que DTC no puede resolver para su entorno. Para obtener información sobre cómo configurar el resultado predeterminado, consulte opción de configuración del servidor in-doubt xact resolution.

Escenario de ejemplo con la duplicación de la base de datos

En el siguiente ejemplo de creación de reflejo de la base de datos se muestra cómo podría producirse una incoherencia lógica. En este ejemplo, una aplicación utiliza una transacción entre bases de datos para insertar dos filas de datos: una fila se inserta en una tabla de una base de datos reflejada, A, y la otra fila se inserta en una tabla de otra base de datos, B. La base de datos A se está reflejando en modo de alta seguridad con conmutación automática por error. Mientras la transacción se confirma, la base de datos A deja de estar disponible y la sesión de creación de reflejo se conmuta por error automáticamente al reflejo de la base de datos A.

Después de la conmutación por error, la transacción entre bases de datos podría confirmarse correctamente en la base de datos B, pero no en la base de datos que ha experimentado la conmutación por error. Por ejemplo, si el servidor principal original de la base de datos A no hubiese enviado el registro de transacciones entre bases de datos al servidor reflejado antes del error. Después de la conmutación por error, esa transacción no existiría en el nuevo servidor principal. Las bases de datos A y B se volverían incoherentes porque los datos insertados en la base de datos B se mantienen intactos, pero los datos insertados en la base de datos A se pierden.

Se puede producir una situación similar al usar una transacción de MS DTC. Por ejemplo, después de la conmutación por error, el nuevo servidor principal se pone en contacto con MS DTC. Sin embargo, MS DTC no tiene constancia del nuevo servidor principal y termina todas las transacciones que están "en preparación para confirmar", pero que se consideran confirmadas en otras bases de datos.

Nota:

No se admite usar la creación de reflejo de la base de datos con DTC ni usar grupos de disponibilidad con DTC de formas no admitidas en este artículo. Esto no implica que los aspectos del producto no relacionados con DTC sean incompatibles; no obstante, no se admiten los problemas derivados del uso incorrecto de las transacciones distribuidas.

Pasos siguientes

Grupos de disponibilidad AlwaysOn: interoperabilidad (SQL Server)