En enkel lösning som jag implementerade i en applikation ....
CREATE TABLE RecordLocks(
[RecordId] [varchar](8) NOT NULL,
[UserName] [varchar](100) NOT NULL,
[datetimestamp] [smalldatetime] NOT NULL,
[PC] [varchar](100) NOT NULL
)
GO
datetimestamp
har en standard på GetDate()
RecordId
är en VARCHAR
på grund av primärnyckeln i tabellen låser jag (inte mitt val). Även denna tabell har de uppenbara indexen
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
Ta först bort och spela in äldre än 2 timmar (byt till färg)
Kontrollera att det inte finns någon post som redan låser den som ska låsas och om inte, sätt i låset.
Välj posten med det RecordId vi är intresserade av.
Kontrollera sedan i samtalskoden för att se om låsningen har lyckats. Om användarnamnet och datorn som kommer tillbaka från vald matchar data som just skickats i låset lyckades. Om användarnamnet matchar men datorn inte gör det har samma användare posten öppen på en annan dator. om användarnamnet inte stämmer överens har en annan användare redan det öppet. Jag visar ett meddelande till användaren om det misslyckas I.E. Denna post är för närvarande låst av JoeB på arbetsstationen XYZ.
När användaren sparar posten eller navigerar bort är det bara att radera postlåset.
Jag är säker på att det finns andra sätt men det här fungerar bra för mig.
Uppdatera
En post kommer bara att infogas om en sådan inte finns. Följande val kommer att returnera en post. Om användarnamnet och/eller datorn skiljer sig från de data du försöker infoga är posten redan låst av en annan användare (eller samma användare på en annan dator). Så ett samtal gör allt (så att säga). Så om jag ringer Exec usp_LockRecord(1234, 'JoeB', 'Workstation1')
och posten jag får tillbaka matchar den data jag har lyckats låsa den posten. Om användarnamnet och/eller datorn jag får tillbaka är annorlunda är posten redan låst. Jag kan sedan visa ett meddelande till användaren om att posten är låst, göra fält läsbara, inaktivera spara-knappar och tala om för dem vem som har ett lås på den om jag vill.