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

Comment implémenter un mécanisme de verrouillage simple pour une application multi-utilisateur ?

Une solution simple que j'ai implémentée dans une application ....

CREATE TABLE RecordLocks(
[RecordId] [varchar](8) NOT NULL,
[UserName] [varchar](100) NOT NULL,
[datetimestamp] [smalldatetime] NOT NULL,
[PC] [varchar](100) NOT NULL

)
GO

datetimestamp a une valeur par défaut de GetDate() RecordId est un VARCHAR à cause de la clé primaire dans la table, je verrouille (pas mon choix). Aussi cette table a les index évidents

CREATE PROCEDURE usp_LockRecord @RecordId VARCHAR(8), @UserName VARCHAR(100), @ComputerName VARCHAR(100)
AS
BEGIN
BEGIN TRAN; 
DELETE FROM RecordLocks WHERE DATEDIFF(HOUR, datetimestamp, GETDATE()) > 2; 
IF NOT EXISTS (Select * from RecordLocks WHERE RecordId = @RecordId) 
    INSERT INTO RecordLocks (RecordId, username, PC) VALUES (@RecordId, @UserName, @ComputerName); 

Select * from RecordLocks WHERE RecordId = @RecordId; 
COMMIT TRAN;
END
GO

Supprimez d'abord et enregistrez plus de 2 heures (modifiez en conséquence)

Vérifiez qu'il n'y a pas d'enregistrement verrouillant déjà celui à verrouiller et si ce n'est pas le cas, insérez le cadenas.

Sélectionnez l'enregistrement avec le RecordId qui nous intéresse.

Ensuite, dans le code d'appel, vérifiez si le verrouillage a réussi. Si le nom d'utilisateur et le PC qui reviennent de la sélection correspondent aux données qui viennent d'être transmises, le verrouillage a réussi. Si le nom d'utilisateur correspond mais que le PC ne correspond pas, le même utilisateur a l'enregistrement ouvert sur une autre machine. si le nom d'utilisateur ne correspond pas, un autre utilisateur l'a déjà ouvert. J'affiche un message à l'utilisateur en cas d'échec I.E Cet enregistrement est actuellement verrouillé par JoeB sur le poste de travail XYZ.

Lorsque l'utilisateur enregistre l'enregistrement ou s'éloigne, supprimez simplement le verrou d'enregistrement.

Je suis sûr qu'il existe d'autres moyens, mais cela fonctionne bien pour moi.

Mettre à jour

Un enregistrement ne sera inséré que s'il n'en existe pas. La sélection suivante renverra un enregistrement. Si le nom d'utilisateur et/ou le PC sont différents des données que vous tentez d'insérer, l'enregistrement est déjà verrouillé par un autre utilisateur (ou le même utilisateur sur une autre machine). Donc, un appel fait tout (pour ainsi dire). Donc, si je fais un appel Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') et l'enregistrement que je récupère correspond aux données que j'ai réussi à verrouiller sur cet enregistrement. Si le nom d'utilisateur et/ou le PC que je récupère sont différents, l'enregistrement est déjà verrouillé. Je peux ensuite afficher un message à l'utilisateur l'informant que l'enregistrement est verrouillé, rendre les champs en lecture seule, désactiver les boutons de sauvegarde et leur dire qui a un verrou dessus si je le souhaite.