Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie implementiert man einen einfachen Sperrmechanismus für Mehrbenutzeranwendungen?

Eine einfache Lösung, die ich in einer Anwendung implementiert habe ....

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

)
GO

datetimestamp hat einen Standardwert von GetDate() RecordId ist ein VARCHAR Wegen des Primärschlüssels in der Tabelle sperre ich (nicht meine Wahl). Auch diese Tabelle hat die offensichtlichen Indizes

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

Zuerst löschen und Aufzeichnungen älter als 2 Stunden (anpassen)

Überprüfen Sie, dass es keinen Datensatz gibt, der den zu sperrenden bereits sperrt, und fügen Sie die Sperre ein, falls nicht.

Wählen Sie den Datensatz mit der Datensatz-ID aus, an der wir interessiert sind.

Überprüfen Sie dann im aufrufenden Code, ob die Sperrung erfolgreich war. Wenn der Benutzername und der PC, die von der Auswahl zurückkommen, mit den gerade übergebenen Daten übereinstimmen, war die Sperre erfolgreich. Wenn der Benutzername übereinstimmt, der PC jedoch nicht, hat derselbe Benutzer den Datensatz auf einem anderen Computer geöffnet. wenn der Benutzername nicht übereinstimmt, hat ihn ein anderer Benutzer bereits geöffnet. Ich zeige dem Benutzer eine Nachricht an, wenn dies nicht erfolgreich ist. I.E. Dieser Datensatz ist derzeit von JoeB auf Workstation XYZ gesperrt.

Wenn der Benutzer den Datensatz speichert oder wegnavigiert, löschen Sie einfach die Datensatzsperre.

Ich bin sicher, es gibt andere Möglichkeiten, aber das funktioniert gut für mich.

Aktualisieren

Ein Datensatz wird nur eingefügt, wenn keiner vorhanden ist. Die folgende Auswahl gibt einen Datensatz zurück. Wenn sich der Benutzername und/oder PC von den Daten unterscheidet, die Sie einzufügen versuchen, ist der Datensatz bereits von einem anderen Benutzer (oder demselben Benutzer auf einem anderen Computer) gesperrt. Ein Anruf genügt also (sozusagen). Wenn ich also einen Anruf mache Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') und der Datensatz, den ich zurückerhalte, stimmt mit den Daten überein. Ich habe diesen Datensatz erfolgreich gesperrt. Wenn der Benutzername und/oder der PC, den ich zurückbekomme, unterschiedlich sind, ist der Datensatz bereits gesperrt. Ich kann dem Benutzer dann eine Nachricht anzeigen, dass der Datensatz gesperrt ist, Felder schreibgeschützt machen, Schaltflächen zum Speichern deaktivieren und ihm mitteilen, wer ihn gesperrt hat, wenn ich dies wünsche.