sql >> Database >  >> RDS >> Sqlserver

Hoe implementeer je een eenvoudig vergrendelingsmechanisme voor toepassingen voor meerdere gebruikers?

Een eenvoudige oplossing die ik heb geïmplementeerd in een applicatie ....

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

)
GO

datetimestamp heeft de standaard GetDate() RecordId is een VARCHAR vanwege de primaire sleutel in de tabel die ik vergrendel (niet mijn keuze). Ook deze tabel heeft de voor de hand liggende 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

Eerst verwijderen en records ouder dan 2 uur (veranderen naar kleur)

Controleer of er geen record is dat degene die moet worden vergrendeld al vergrendelt en zo niet, plaats het slot.

Selecteer het record met de RecordId waarin we geïnteresseerd zijn.

Controleer vervolgens in de belcode of de vergrendeling is gelukt. Als de gebruikersnaam en pc die terugkomen van de selectie overeenkomen met de gegevens die zojuist in het slot zijn doorgegeven, waren succesvol. Als de gebruikersnaam overeenkomt, maar de pc niet dezelfde gebruiker heeft, heeft de record op een andere computer geopend. als de gebruikersnaam niet overeenkomt, heeft een andere gebruiker deze al geopend. Ik geef een bericht weer aan de gebruiker als het niet lukt, I.E. Dit record is momenteel vergrendeld door JoeB op werkstation XYZ.

Wanneer de gebruiker het record opslaat of weg navigeert, verwijdert u gewoon de recordvergrendeling.

Ik weet zeker dat er andere manieren zijn, maar dit werkt goed voor mij.

Bijwerken

Een record wordt alleen ingevoegd als er geen bestaat. De volgende selectie zal een record retourneren. Als de gebruikersnaam en/of pc verschilt van de gegevens die u probeert in te voeren, is het record al vergrendeld door een andere gebruiker (of dezelfde gebruiker op een andere computer). Dus één oproep doet alles (om zo te zeggen). Dus als ik bel Exec usp_LockRecord(1234, 'JoeB', 'Workstation1') en het record dat ik terugkrijg, komt overeen met die gegevens die ik met succes op dat record heb gekregen. Als de gebruikersnaam en/of pc die ik terugkrijg anders is, is het record al vergrendeld. Ik kan dan een bericht weergeven aan de gebruiker met de mededeling dat het record is vergrendeld, velden alleen-lezen maken, opslagknoppen uitschakelen en hen vertellen wie er een slot op heeft als ik dat wil.



  1. tsvector ondersteunt alleen Engels?

  2. LISTAGG in Oracle om verschillende waarden te retourneren

  3. Selecteer rijen die niet in een andere tabel staan, SQL Server-query

  4. Het verschil vinden tussen de laatste en de op één na laatste term