Síntomas
Cuando se usa el reflejo de base de datos en Microsoft SQL Server 2012 o Microsoft SQL Server 2014, es posible que se alcance una condición Assert y que la creación de reflejos de base de datos entre en el estado suspendido.
Causa
El problema se produce porque, al asignar una página nueva, SQL Server obtiene un bloqueo X en la página nueva. SQL Server colocará la hobt_id (ID. de árbol B) a la que pertenece la nueva página en la solicitud de bloqueo. Sin embargo, SQL Server no puede poner el hobt_id en el registro de reflejos y tiene como resultado un comportamiento de Bloqueo diferente entre el principal y el reflejo. Esto se puede explicar en detalle de la siguiente manera:
-
T1 mantenga un bloqueo IX en la página P1.
-
T2 realizar una división de página en P1, asignar una nueva página P2, se usa una transmisión de transacción del sistema aquí, que mantiene un bloqueo X en P2. En este caso, SQL Server no puso el hobt_id en el registro de reflejo.
-
TX realiza una migración de bloqueo de T1 para mover el bloqueo IX de P1 a P2.
-
TX confirmada, ahora T2 puede usar la página P2 y T2 obtener otro bloqueo IX en la página P2.
-
T1 confirmado, ahora T2 es el único que posee un bloqueo IX en P2.
-
Después de una gran cantidad de inserciones, se produce un aumento de nivel de bloqueo, en el principal, T2 libera el IX de P2, pero en el reflejo, durante el aumento de bloqueo, T2 no liberaba el bloqueo IX.
-
Después de haber eliminado una gran cantidad de páginas, la página P2 se ha vaciado y se ha cancelado su asignación.
-
T3 necesita una nueva página y se asigna a P2, esto requiere un bloqueo X, pero en el reflejo, no se pudo realizar este paso debido al paso 6.
En el reflejo, el paso 6 no libera el bloqueo IX porque la hobt_id en el bloque de bloqueo es incorrecta. Esta hobt_id incorrecta viene durante el paso 2 y, debido a que SQL Server no pone la hobt_id en el registro de creación de reflejo. generalmente, no verá ningún problema porque la transmisión en el paso 2 es muy breve, y se liberará el bloque de bloqueo con hobt_id incorrecta cuando se confirme. Sin embargo, a causa de la migración de bloqueo en Step3 y los siguientes pasos (4 y 5), este bloqueo de bloqueo con hobt_id incorrecto se mantiene y, por último, causa el problema. El principal no tiene este problema porque usa una hobt_id correcta en el paso 2. Pero el registro no tiene hobt_id correctas.
Resolución
El problema se solucionó por primera vez en la siguiente actualización acumulativa de SQL Server.
Actualización acumulativa 1 para SQL Server 2014 /en-us/help/2931693
Actualización acumulativa 9 para SQL Server 2012 SP1 /en-us/help/2931078
Cada actualización acumulativa para SQL Server contiene todas las revisiones y todas las revisiones de seguridad incluidas en la actualización acumulativa anterior. Consulte las últimas actualizaciones acumulativas para SQL Server:
Solución alternativa
Para solucionar el problema, reinicialice el reflejo para finalizar el estado suspendido.
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".