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

Comment effectuer un verrouillage de ligne ?

En supposant qu'il s'agit du serveur MS SQL, vous voulez probablement UPDLOCK , éventuellement combiné avec ROWLOCK (Conseils de tableau ). J'ai du mal à trouver un article décent qui décrit la théorie, mais voici un exemple rapide :

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

Cette instruction placera un verrou de mise à jour sur la ligne pendant toute la durée de la transaction (il est donc important de savoir quand la transaction se terminera). Comme les verrous de mise à jour sont incompatibles avec les verrous exclusifs (nécessaire pour mettre à jour les enregistrements), cela empêchera quiconque de mettre à jour cet enregistrement tant que la transaction n'est pas terminée.

Notez que les autres processus tentant de modifier cet enregistrement seront bloqués jusqu'à la fin de la transaction, mais continueront avec l'opération d'écriture qu'ils ont demandée une fois la transaction terminée (à moins qu'ils ne soient expirés ou tués en tant que processus bloqué). Si vous souhaitez empêcher cela, vos autres processus doivent utiliser des conseils supplémentaires afin d'abandonner si un verrou incompatible est détecté ou d'ignorer l'enregistrement s'il a changé.

En outre, Vous ne devez pas utiliser cette méthode pour verrouiller les enregistrements en attendant l'entrée de l'utilisateur . Si telle est votre intention, vous devriez plutôt ajouter une sorte de colonne "en cours de modification" à votre tableau.

Les mécanismes de verrouillage du serveur SQL ne conviennent vraiment que pour préserver l'intégrité des données / prévenir les interblocages - les transactions doivent généralement être maintenues aussi courtes que possible et ne devrait certainement pas être maintenu en attendant l'entrée de l'utilisateur.