sql >> Databáze >  >> RDS >> Sqlserver

Jak implementovat jednoduchý zamykací mechanismus pro víceuživatelskou aplikaci?

Jednoduché řešení, které jsem implementoval do aplikace ....

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

)
GO

datetimestamp má výchozí hodnotu GetDate() RecordId je VARCHAR kvůli primárnímu klíči v tabulce zamykám (není moje volba). Také tato tabulka má zřejmé indexy

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

Nejprve odstraňte a záznamy starší než 2 hodiny (změňte podle potřeby)

Zkontrolujte, zda již neexistuje žádný záznam zamykající ten, který chcete uzamknout, a pokud ne, vložte zámek.

Vyberte záznam s RecordId, který nás zajímá.

Poté v volacím kódu zkontrolujte, zda byl zámek úspěšný. Pokud se uživatelské jméno a PC vracející se z výběru shodují s daty právě předanými v zámku, byla úspěšná. Pokud se uživatelské jméno shoduje, ale na počítači není stejný uživatel, záznam je otevřen na jiném počítači. pokud se uživatelské jméno neshoduje s jiným uživatelem, má jej již otevřené. V případě neúspěšného I.E zobrazím uživateli zprávu. Tento záznam je aktuálně uzamčen JoeB na pracovní stanici XYZ.

Když uživatel uloží záznam nebo odejde, stačí odstranit zámek záznamu.

Jsem si jistý, že existují i ​​​​jiné způsoby, ale pro mě to funguje dobře.

Aktualizovat

Záznam bude vložen pouze v případě, že neexistuje. Následující výběr vrátí záznam. Pokud se uživatelské jméno a/nebo počítač liší od údajů, které se pokoušíte vložit, záznam je již zablokován jiným uživatelem (nebo stejným uživatelem na jiném počítači). Takže jeden hovor udělá vše (tak říkajíc). Pokud tedy zavolám Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') a záznam, který získám zpět, se shoduje s daty, na kterých jsem úspěšně získal zámek. Pokud se uživatelské jméno a/nebo PC, které dostanu zpět, liší, záznam je již uzamčen. Poté mohu uživateli zobrazit zprávu s upozorněním, že záznam je uzamčen, nastavit pole pouze pro čtení, deaktivovat tlačítka pro uložení a sdělit jim, kdo má na něm zámek, pokud si to přeji.



  1. Použití výsledku SQL ve smyčce foreach

  2. CHOP s INSERT INTO prostřednictvím připravených výpisů

  3. Jak používat parametr OUTPUT v uložené proceduře

  4. json_encode změní pole na objekt