In C# können Sie try-catch-finally-Blöcke verwenden und Ihre Bereinigung im finally durchführen. (Was egal was passiert ausgeführt werden sollte).
Sie könnten praktisch das Gleiche erreichen, indem Sie eine Klasse erstellen, die IDisposable
implementiert, die das Schloss erhält und es freigibt, wenn die Dispose-Methode aufgerufen wird. Dann immer, wenn Sie diese Klasse verwenden (das Schloss erhält), fügen Sie einen using-Block hinzu
using (RecordLockingThing myThing = new RecordLockingThing())
{
//DoStuff
}
//Jetzt ist myThing außerhalb des Gültigkeitsbereichs und wurde entsorgt.
Stellen Sie einfach sicher, dass Ihre RecordLockingThing
das Schloss korrekt und sicher in der Dispose-Methode freigibt.
Eine andere Strategie könnte sein, Datensätze nicht zu markieren, um sie zu sperren, wenn sie geöffnet werden, sondern sie stattdessen als bearbeitet zu markieren (oder eine Revisionsnummer zu erhöhen). Dann können Sie mehr als eine Person den Datensatz öffnen lassen. Wenn jemand eine Bearbeitung einreicht, lassen Sie sie auch die Revisionsnummer einreichen. Wenn sie übereinstimmt, übernehmen Sie die Bearbeitung und erhöhen die Revisionsnummer, andernfalls melden Sie eine "Mid-Air-Kollision" und verwerfen die Bearbeitungen (nicht sehr benutzerfreundlich) oder versuchen lassen den Benutzer die Datensätze zusammenzuführen.
Wenn Bearbeitungen im Vergleich zu Lesevorgängen relativ selten sind, ist die zweite Strategie in der Praxis nützlicher, da Sie einem Benutzer niemals verwehren, sich zumindest einen Datensatz anzusehen, und es kein Risiko von verwaisten Sperren gibt.