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

Obtenga el bloqueo de la tabla de actualización al inicio del procedimiento almacenado en SQL Server

Tú dijiste:

Simplemente necesita un bloqueo de lectura compartido durante la duración de la TXN. Esto significa que ningún otro proceso puede obtener un bloqueo de "escritura", junto con un TABLOCK. Y tampoco necesitas COUNT.

...
   BEGIN TRANSANCTION
     SELECT TOP 1 KeyCol FROM TheTable WITH (TABLOCK, HOLDLOCK)
...

¿Por qué crees que quieres un BLOQUEO DE ACTUALIZACIÓN?

HOLDLOCK o SERIALIZABLE

Editar, después del comentario:

  • "bloqueo exclusivo" significa "solo un proceso que usa los datos".
  • "SERIALIZABLE" básicamente significa mantener los bloqueos (compartidos, exclusivos, lo que sea) durante mucho más tiempo.

No puede especificar "bloqueo exclusivo" y permitir que otros procesos lean. Los conceptos son mutuamente excluyentes. Desea evitar escrituras en toda la tabla, que persistió el bloqueo compartido/de lectura servirá. Aquí es donde entra en juego SERIALIZABLE.

De "Modos de bloqueo"

Entonces:un bloqueo compartido no permite escrituras y se puede hacer que persista haciéndolo SERIALIZABLE