me semble manquer serrures wrt quelque chose dans SQL Server 2008. Ceci est mon scénario:lecture seule verrouiller dans SQL Server
- begin tran.
- Lisez le tableau A pour vous assurer qu'une ligne particulière est trouvée.
- Pendant la lecture, placez un verrou en lecture seule sur la ligne unique lue. Si non trouvé, erreur de lancer.
- Insérer dans la table B, qui inclut une référence à la table A.
- 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
Merci beaucoup John :) – IamIC
De rien, heureux d'aider! –