Implementieren von Anwendungssperren in SQL Server (Distributed Locking Pattern)

7

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 intDatentypen.

In diesem Muster möchten wir alle unsere Sperren als FIFO behandeln, was SERIALIZABLEuns 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:

  1. Muss ich das "Entsperren" SERIALIZABLEauch machen?
  2. Gibt es andere Ansätze, die ich verwenden könnte / alles, was ich vergessen habe?

SQL Server kann entweder 2008/2012 sein

Stuart Blackler
quelle

Antworten:

12

Muss ich das "Entsperren" SERIALIZABLEauch machen?

Trotz des Namens garantiert die serialisierbare Isolationsstufe nicht, dass Transaktionen nacheinander oder in der empfangenen Reihenfolge ausgeführt werden. Serialisierbare Garantietransaktionen haben vielmehr die gleichen dauerhaften Auswirkungen auf die Datenbank, als ob sie nacheinander in einer undefinierten Reihenfolge ausgeführt worden wären (weitere Informationen finden Sie unter dem Link).

Gibt es andere Ansätze, die ich verwenden könnte / alles, was ich vergessen habe?

Ja. SQL Server bietet bereits Unterstützung für beliebige Anwendungssperren über:

Diese integrierten Applock-Funktionen bieten eine breite Palette von Optionen und umfassen die automatische Deadlock-Erkennung (obwohl alle erforderlichen Transaktions-Rollbacks in der Verantwortung des Programmierers liegen). Sie können beispielsweise in verschiedenen Modi zwischen Sperren für Transaktionen und Sitzungen wählen. Die Verwendung dieser Funktionen zur Implementierung des von Ihnen benötigten Verhaltens sollte recht einfach und sicherlich einfacher sein, als Ihren eigenen ausfallsicheren und zuverlässigen Sperrmanager von Grund auf neu zu erstellen.

Paul White 9
quelle