sql >> Base de Datos >  >> RDS >> Sqlserver

Confundido sobre UPDLOCK, HOLDLOCK

¿Por qué bloquearía UPDLOCK las selecciones? La Matriz de compatibilidad de bloqueo muestra claramente N para la contención S/U y U/S, como en Sin conflicto .

En cuanto a la pista HOLDLOCK, la documentación dice:

HOLDLOCK:Equivale a SERIALIZABLE. Para obtener más información, consulte SERIALIZABLE más adelante en este tema.

...

SERIALIZABLE:... El escaneo se realiza con la misma semántica que una transacción que se ejecuta en el nivel de aislamiento SERIALIZABLE...

y el tema Nivel de aislamiento de transacciones explica lo que significa SERIALIZABLE:

Ninguna otra transacción puede modificar los datos leídos por la transacción actual hasta que se complete la transacción actual.

Otras transacciones no pueden insertar filas nuevas con valores clave que se encuentren en el rango de claves leídas por cualquier declaración en la transacción actual hasta que se complete la transacción actual.

Por lo tanto, el comportamiento que ve está perfectamente explicado por la documentación del producto:

  • UPDLOCK no bloquea SELECCIÓN ni INSERCIÓN concurrentes, pero bloquea cualquier ACTUALIZACIÓN o ELIMINACIÓN de las filas seleccionadas por T1
  • HOLDLOCK significa SERALIZABLE y por lo tanto permite SELECCIONES, pero bloquea ACTUALIZAR y ELIMINAR de las filas seleccionadas por T1, también como cualquier INSERT en el rango seleccionado por T1 (que es la tabla completa, por lo tanto cualquier insertar).
  • (UPDLOCK, HOLDLOCK):su experimento no muestra qué bloquearía además del caso anterior, a saber, otra transacción con UPDLOCK en T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX sin necesidad de explicaciones

La verdadera pregunta es qué estás tratando de lograr ? Jugar con sugerencias de bloqueo sin una comprensión absoluta y completa del 110 % de la semántica de bloqueo está pidiendo problemas...

Después de editar OP:

Me gustaría seleccionar filas de una tabla y evitar que los datos de esa tabla se modifiquen mientras la estoy procesando.

Debe usar uno de los niveles más altos de aislamiento de transacciones. La LECTURA REPETIBLE evitará que se modifiquen los datos que lee. SERIALIZABLE evitará que se modifiquen los datos que lees y se inserten nuevos datos. Usar niveles de aislamiento de transacciones es el enfoque correcto, en lugar de usar sugerencias de consulta. Kendra Little tiene un bonito póster que explica los niveles de aislamiento.