In meiner Anwendung muss ich ein verteiltes Sperrmuster durchführen. Da wir bereits eine Instanz von SQL Server verwenden können, haben wir beschlossen, dass es am einfachsten ist, die Sperrung auf SQL-Ebene unserer Webanwendung zu implementieren.
Ein Schloss kann basierend auf zahlreichen Bedingungen erhalten werden, einschließlich:
- Die Art der angeforderten Sperre
- Eine beliebige Anwendungskennung
Behandeln Sie die beiden oben genannten Bedingungen in jeder Hinsicht als int
Datentypen.
In diesem Muster möchten wir alle unsere Sperren als FIFO behandeln, was SERIALIZABLE
uns meiner Meinung nach durch die Isolationsstufe erreicht wird.
Hier ist, wie wir vorschlagen, die "Sperre" durchzuführen:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
IF EXISTS (SELECT 1 FROM locks WHERE LockType = @LockType AND ApplicationIdentifier = @ApplicationIdentifier)
BEGIN
-- Awesome, the lock will be acquired
INSERT INTO locks OUTPUT INSERTED.LockId VALUES (2,3)
END
ELSE
BEGIN
-- Someone already has the lock
SELECT -1
END
SET TRANSACTION ISOLATION LEVEL READ COMITTED
Und das "entsperren":
DELETE FROM locks WHERE LockId = @LockId
Meine Frage ist also zweifach:
- Muss ich das "Entsperren"
SERIALIZABLE
auch machen? - Gibt es andere Ansätze, die ich verwenden könnte / alles, was ich vergessen habe?
SQL Server kann entweder 2008/2012 sein
quelle