Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir le verrou de table de mise à jour au début de la procédure stockée dans SQL Server

Vous avez dit :

Vous avez simplement besoin d'un verrou de lecture partagé pour la durée du TXN. Cela signifie qu'aucun autre processus ne peut obtenir un verrou "en écriture", en conjonction avec un TABLOCK. Et vous n'avez pas non plus besoin de COUNT.

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

Pourquoi pensez-vous que vous voulez un VERROU DE MISE À JOUR ?

HOLDLOCK ou SERIALIZABLE

Modifier, après commentaire :

  • "verrou exclusif" signifie "un seul processus utilisant les données".
  • "SERIALIZABLE" signifie essentiellement conserver les verrous (partagés, exclusifs, peu importe) pendant beaucoup plus longtemps.

Vous ne pouvez pas spécifier "verrou exclusif" et permettre aux autres processus de lire. Les concepts sont mutuellement exclusifs. Vous voulez empêcher les écritures sur l'ensemble de la table, ce qui a persisté le verrou partagé/en lecture fera l'affaire. C'est là qu'intervient SERIALIZABLE.

À partir de "Modes de verrouillage"

Donc :un verrou partagé interdit les écritures et peut être rendu persistant en le rendant SERIALIZABLE