Wie kann ich „pessimistische Sperren“ in einer asp.net Anwendung implementieren?

StackOverflow https://stackoverflow.com/questions/617934

  •  03-07-2019
  •  | 
  •  

Frage

würde ich eine Beratung von jemandem mit der Umsetzung etwas wie „pessimistische Sperren“ in einer asp.net Anwendung erfahren. Dies ist das Verhalten Ich suche nach:

  1. Benutzer A öffnet, um # 313
  2. Benutzer B versucht, 313 Ordnung # zu öffnen, aber wird gesagt, dass Benutzer A die Bestellung geöffnet ausschließlich für X Minuten haben.

Da ich diese Funktionalität bisher nicht umgesetzt haben, ich habe ein paar Design-Fragen:

  • Welche Daten sollte ich in die Auftragsdatensatz anhängen? Ich denke darüber nach:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

Ich würde eine Aufzeichnung betrachten entsperrt, wenn die LockRefreshedTime <(jetzt - 10 min).

  • Wie garantiere ich, dass Sperren nicht länger als nötig gehalten werden, aber nicht verfallen unerwartet entweder?

Ich bin ziemlich komfortabel mit jQuery so Ansätze, die Verwendung von Client-Skript sind willkommen machen. Dies würde eine interne Web-Anwendung sein, so dass ich mit meiner Nutzung der Bandbreite / Zyklen eher liberal sein kann. Ich frage mich auch, wenn „pessimistische Sperren“ ein geeigneter Begriff für dieses Konzept ist.

War es hilfreich?

Lösung

Es klingt wie Sie die meisten der Weg dorthin sind. Ich glaube nicht, dass Sie wirklich brauchen LockRefreshedTime obwohl, ist es nicht wirklich etwas hinzufügen. Sie können auch nur die LockAcquiredTime verwenden, um zu entscheiden, wenn eine Sperre abgestanden worden ist.

Das andere, was Sie wollen zu tun ist, stellen Sie sicher, Nutzung von Transaktionen zu machen. Sie müssen die Kontrolle und Einstellung der Sperre innerhalb einer Datenbanktransaktion wickeln, so dass Sie nicht mit zwei Teilnehmern am Ende, die denken, dass sie eine gültige Sperre haben.

Wenn Sie Aufgaben, die gewinnen Schlösser benötigen auf mehr als eine Ressource (dh mehr als einen Datensatz eines bestimmten Typs oder mehr als eine Art der Aufzeichnung), dann müssen Sie die Sperren in derselben Reihenfolge anwenden, wo immer Sie die Verriegelung tun . Ansonsten können Sie eine tote Sperre haben, wo ein Stück Code hat A gesperrt aufnehmen und fehlt Rekord B sperren und ein weiteres Stück Code gesperrt hat B und ist für die Aufzeichnung A warten.

, wie Sie Sperren sicherstellen, nicht unerwartet freigegeben. Stellen Sie sicher, dass, wenn Sie haben keine lange laufenden Prozess, der länger als der Sperre Timeout laufen konnte, dass es seine Sperre während seines Laufs aktualisiert wird.

Der Begriff „explizite Sperren“ wird auch verwendet, um diese Zeit der Verriegelung zu beschreiben.

Andere Tipps

Ich habe dies manuell erfolgen.

  • Speichern Sie die Primärschlüssel des Datensatzes zu einer Sperrtabelle, und markieren Sie Datensatz Modus-Attribut zu bearbeiten.
  • Wenn ein anderer Benutzer diesen Datensatz wählen versucht, geben Sie die Benutzer- fertig Rekord.
  • Haben Sie eine Set-up maximale Zeit für die Datensätze sperren.
  • Seite aktualisieren Daten für gesperrte Datensätze. Während ein Benutzer darf Änderungen vornehmen, werden alle anderen Benutzer nur erlaubt, zu überprüfen.

Sperrtabelle Design ähnlich wie diese haben sollte:

User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.

Rest Logik ist etwas, das Sie, um herauszufinden, haben.

Das ist nur eine Idee, die ich auf Wunsch eines Kunden vor 4 Jahren umgesetzt. Nach diesem Client hat niemand mich wieder fragte etwas ähnliches zu tun, also habe ich eine andere Methode nicht erreicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top