2010-12-13 54 views
3

me semble manquer serrures wrt quelque chose dans SQL Server 2008. Ceci est mon scénario:lecture seule verrouiller dans SQL Server

  1. begin tran.
  2. Lisez le tableau A pour vous assurer qu'une ligne particulière est trouvée.
  3. Pendant la lecture, placez un verrou en lecture seule sur la ligne unique lue. Si non trouvé, erreur de lancer.
  4. Insérer dans la table B, qui inclut une référence à la table A.
  5. Validez le transfert (relâchement du verrou).

En raison de diverses contraintes de conception, dans ce cas particulier, je ne peux pas créer une relation pour gérer cela pour moi. Donc je dois le faire avec du code.

Je ne veux pas XLOCK ou UPDLOCK table A car la transaction dans laquelle je suis ne fait que lire, pas écrire. Cependant, évidemment, je ne veux rien d'autre pour mettre à jour/supprimer la ligne référencée non plus. J'ai donc besoin d'un verrou en lecture seule d'un point de vue externe.

Je ne souhaite pas que des lectures fantômes soient possibles. Je ne veux pas que différentes versions de lignes soient possibles, évidemment.

Une fois que le tran est engagé, il est très bien pour le tableau A à modifier, car un déclencheur (après suppression) sera null la référence dans le tableau B.

C'est ce que j'ai:

BEGIN TRAN 
-- test 
IF NOT EXISTS (
    SELECT 1 
    FROM Table1 
    WITH (HOLDLOCK, ROWLOCK) 
    WHERE (ID = @ID) 
) {throw} 

    {perform insert into Table2} 
COMMIT TRAN 

Répondre

1

Définissez votre niveau d'isolation des transactions sur REPEATABLE READ pour la durée de votre transaction. À mon avis, il est également préférable d'utiliser des HINTS de verrouillage en raison de la plus grande clarté de votre implémentation de code.

Comme vous ne lisez qu'une seule ligne, vous n'avez pas besoin de vous soucier des plaquettes de distance de votre téléviseur, ce qui est un exemple de REPEATABLE READ.

Je suggère de lire le chapitre "Locking and Latches" dans le livre Professional SQL Server 2008 Internals and Troubleshooting. Il contient d'excellentes explications, y compris des exemples de code, des différents niveaux d'isolement disponibles dans SQL Server ainsi que la description des mécanismes de chacun des scénarios d'anomalies de données, tels que Phantoms, etc.

AVERTISSEMENT: Je ne suis pas sur payroll pour ce titre mais j'ai deux copies, une dure et une autre sur Kindle Edition, c'est comme ça que je l'ai acheté deux fois!

+0

Merci beaucoup John :) – IamIC

+0

De rien, heureux d'aider! –