Ich möchte eine Sperrtabelle für pessimistisches Offline-Sperren verwenden, um den Fall zu verhindern, wenn mehrere Benutzer an einem Arbeitselement arbeiten. Ich verwende eine Sperrtabelle zum Speichern der aktiven Sperren und zwei gespeicherte Prozeduren zum Sperren und Entsperren.Ist dies ein guter Ansatz für die Verwendung von Sperrtabellen in SQL Server?
Die Struktur meiner Sperrtabelle ist die folgende: CaseId (PK) | Benutzer-ID | SchlossValidTo.
Zum Sperren und Entsperren habe ich zwei gespeicherte Prozeduren geschrieben, eine zum Sperren und eine zum Entsperren.
Das ist meine gespeicherte Prozedur zum Verriegeln:
BEGIN
BEGIN TRY
INSERT INTO scs.dbo.caselocks VALUES (@caseId, @agentId, dateadd(n, @lockTime, getdate()))
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
Und das ist zum Entfernen von Sperren:
BEGIN
BEGIN TRY
DELETE FROM scs.dbo.caselocks
WHERE caseid = @caseid
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
Meine Frage ist, dass, ist dies ein richtiger Ansatz für die Handhabung Schlösser? (Entschuldigung, wenn dies in Code Review anstelle von SO gepostet werden sollte.)
Ich denke, dieser Ansatz wird funktionieren. Wenn Sie 'CaseId' in Ihre 'caselocks'-Tabelle setzen, werden keine Race Conditions möglich. Wie oft planen Sie das Sperren und Entsperren? Haben Sie über die Leistung dieses Ansatzes nachgedacht? –
Was ist falsch mit dem Standard-SQL-inhärenten Sperren? Das Problem mit diesem Ansatz ist, was passiert, wenn das Programm bricht oder stoppt oder getötet wird oder was auch immer, bevor es den Datensatz freigibt? – Rodolfo
Sperren werden entfernt, wenn der Benutzer seine Arbeit an dem von ihm bearbeiteten Element beendet hat. (Und ein geplanter Job wird Sperren aufräumen, falls die Anwendung abstürzt/etc.) In Bezug auf die Leistung weiß ich nicht wirklich, wie das funktionieren würde. Gibt es einen "effizienteren" Weg dazu? – norbip