sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan implementerer man en simpel låsemekanisme til flerbrugerapplikation?

En simpel løsning jeg implementerede 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 er en VARCHAR på grund af den primære nøgle i tabellen låser jeg (ikke mit valg). Også denne tabel har de åbenlyse indekser

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

Først slettes og optages ældre end 2 timer (skift til jakkesæt)

Tjek, at der ikke er nogen registrering, der allerede låser den, der skal låses, og hvis ikke, indsæt låsen.

Vælg posten med det RecordId, vi er interesseret i.

Kontroller derefter i opkaldskoden for at se, om låsen er lykkedes. Hvis brugernavnet og pc'en, der kommer tilbage fra valget, stemmer overens, var de data, der lige er blevet sendt i låsen. Hvis brugernavnet matcher, men pc'en ikke gør det, har den samme bruger posten åben på en anden maskine. hvis brugernavnet ikke stemmer overens, har en anden bruger allerede det åbent. Jeg viser en besked til brugeren, hvis den mislykkedes I.E. Denne post er i øjeblikket låst af JoeB på arbejdsstationen XYZ.

Når brugeren gemmer posten eller navigerer væk, skal du bare slette postlåsen.

Jeg er sikker på, at der er andre måder, men det fungerer godt for mig.

Opdater

En post vil kun blive indsat, hvis en sådan ikke findes. Følgende valg returnerer en post. Hvis brugernavnet og/eller pc'en er forskellig fra de data, du forsøger at indsætte, er posten allerede låst af en anden bruger (eller samme bruger på en anden maskine). Så ét opkald gør alt (så at sige). Så hvis jeg foretager et opkald Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') og den post, jeg får tilbage, matcher de data, jeg har fået en lås på den post. Hvis brugernavnet og/eller pc'en, jeg får tilbage, er anderledes, er posten allerede låst. Jeg kan derefter vise en besked til brugeren om at oplyse, at posten er låst, gøre felter kun læsevenlige, deaktivere gem-knapper og fortælle dem, hvem der har en lås på den, hvis jeg ønsker det.



  1. Sådan indsætter du Emoji (UTF8 4 Byte-tegn) i MySQL <5.5

  2. Indstil session med postdata

  3. Hvordan installeres pyodbc 64-bit?

  4. Installation af webserver i FreeBSD 6.0 med Apache 2.2, MySQL 5.0 og PHP 5 – Del 3