J'ai une table, qui a un champ "Lockedby", qui peut être nul (personne n'a verrouillé cet enregistrement pour l'édition) ou peut avoir un identifiant utilisateur.
L'idée est de le faire pour que seul un membre de l'équipe puisse "vérifier" l'enregistrement (et tous les enregistrements dans d'autres tables liés à cet enregistrement) à la fois, qui semblait facile dans ma tête, jusqu'à ce que je réalise que je Ne sais pas vraiment comment le verrouillage fonctionne avec des transactions dans SQL Server.
Actuellement, je mettez à jour des tables à l'aide des transactions et enregistrez des points dans une procédure stockée, mais je ne sais pas comment incorporer le "LOCK":
BEGIN TRANSACTION TR1
BEGIN TRY
UPDATE LOCK_TABLE SET UpdatedDate=GETDATE() WHERE ID=@ID
--======================================================================
--only update this table if the lock field is null; make sure no one
--else can modify the lock field until the whole of TR1 is committed
--or rolled back
--======================================================================
--Table 1
SAVE TRANSACTION TR2
BEGIN TRY
UPDATE TABLE1 SET somefield='something' WHERE LockTableID=@ID
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION TR2;
PRINT ERROR_MESSAGE();
END CATCH
COMMIT TRANSACTION TR1;
--======================================================================
--release the lock
--======================================================================
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION TR1;
SET @RETURN=-1;
PRINT ERROR_MESSAGE();
END CATCH
Je comprends les serrures d'un point de vue de programmation simultané, mais chaque introduction SQL Server aux verrous semble être de prévenir les impasses ou sur la manière d'utiliser différentes granularités de serrures.
Je pense que ce que je veux, c'est juste "d'ici à ici, ne laissez personne exécuter cette procédure stockée" (comme une serrure dans une fonction multi-filetée), mais peut-être que je l'arrive du mauvais angle.
SQL Server fait-il ce que je veux automatiquement lorsque j'utilise des transactions? Ou existe-t-il quelque chose de spécial, je dois ajouter de manière à verrouiller d'autres appels à cette procédure stockée?
SQL Server a des options de verrouillage très étendues. La plupart sont automatiques mais vous pouvez les forcer si nécessaire pour des cas spécifiques. Vous pouvez également implémenter un comportement de verrouillage non par défaut sur différents niveaux. Ce que vous cherchez (autant que je puisse dire) peut mieux être géré par une indice de table appelée Rowlock. Selon votre niveau d'isolement, vous aurez peut-être besoin de conseils supplémentaires pour assurer sa fonction. Vous pouvez en savoir plus à ce sujet dans le lien suivant: https://msdn.microsoft.com/en-us/library/ms187373.côt
Idée rondelle, utilisez les autorisations à la place.
Peut-être que les procédures stockées que vous utilisez ajouteront ou suppriment des autorisations d'autres personnes sur la base d'enregistrements d'enregistrement ou de sortie.
Exemple: l'utilisateur A utilise une procédure stockée qui vérifie l'enregistrement, lorsque l'enregistrement est vérifié, il applique des privilèges R/W à cet utilisateur. Lorsque l'enregistrement est vérifié, il supprime W et ne s'applique que R. (une gâchette incendierait l'écriture sur une table d'accompagnement montrant qui a des autorisations d'écriture lorsqu'elle est vérifiée et efface l'enregistrement lorsque personne n'a des autorisations d'écriture.)
Exemple 2: L'utilisateur B utilise une procédure stockée qui vérifie l'enregistrement, il examine une table de recherche des utilisateurs et sélectionne l'utilisateur actuel. Le reste des utilisateurs de la table de mappage Obtenez des autorisations sur la table supprimées lorsque l'enregistrement est vérifié. Lorsque l'enregistrement est enregistré, la procédure examine la table de mappage et ajoute des autorisations à tous les utilisateurs en plus du courant.