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

SQL Server, el engañoso XLOCK y optimizaciones

Exclusividad de X cerraduras vs U cerraduras

En la siguiente matriz de compatibilidad de bloqueo, se puede ver que X lock solo es compatible con la estabilidad del esquema y los tipos de bloqueo Insert Range-Null. U es compatible con los siguientes tipos de bloqueo compartido adicionales S /IS /RS-S /RI-S /RX-S

matriz de compatibilidad de bloqueo http://i.msdn.microsoft.com/ms186396.LockConflictTable(en-us,SQL.105).gif

Granularidad de X cerraduras

Estos se sacan bien en todos los niveles. El seguimiento del script y del generador de perfiles a continuación demuestra que se eliminaron con éxito a nivel de fila.

CREATE TABLE test_table (id int identity(1,1) primary key, col char(40))

INSERT INTO test_table
SELECT NEWID() FROM sys.objects

select * from test_table with (rowlock,XLOCK) where id=10

¡Pero aún se pueden leer las filas!

Resulta que en read committed nivel de aislamiento SQL Server no siempre eliminará S locks, omitirá este paso si no hay riesgo de leer datos no confirmados sin ellos. Esto significa que no hay garantía de que ocurra un conflicto de bloqueo.

Sin embargo, si la selección inicial es with (paglock,XLOCK) entonces esto será detener la transacción de lectura como X el bloqueo en la página bloqueará el IS bloqueo de página que siempre será necesario para el lector. Por supuesto, esto tendrá un impacto en la concurrencia.

Otras advertencias

Incluso si bloquea la fila/página, esto no significa que bloquee todos los accesos a esa fila en la tabla. Un bloqueo en una fila en el índice agrupado no evitará que las consultas lean datos de la fila correspondiente en un índice no agrupado de cobertura.