2012-04-04 12 views
1

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

+0

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? –

+0

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

+0

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

Antwort

1

Für den Lösch-SP, erlauben Sie jedem Agenten, die Sperre zu löschen? Warum geben Sie ein ResultSet mit "SELECT" aus dem SP zurück? Sie könnten einfach die RETURN-Anweisung verwenden.

Ich sehe, dass Sie die Funktion getdate() verwenden, um eine Zeit in der lokalen Zeitzone beizubehalten. Dies ist häufig ein Grund für Probleme, wenn Sie mit mehreren Zeitzonen arbeiten, zur/von der Sommerzeit usw. wechseln. Die beste Vorgehensweise besteht darin, immer UTC-Zeiten zu verwenden, wenn Sie ein Datum/eine Uhrzeit beibehalten und nur zur Ortszeit konvertieren wird einem Benutzer angezeigt.

+0

Agents können keine Sperren löschen. Das Sperren und Entsperren wird von der Anwendung verwaltet, wenn ein Agent versucht, ein Arbeitselement im Bearbeitungsmodus zu öffnen. Vielen Dank für die UTC-Nutzung und Rücksendevorschläge. – norbip

Verwandte Themen