Umgang mit Sperren (JPA)?

8

Nach dem Java Persistent / Sperren wikibooks *, der beste Weg, mit Sperren umgehen besteht darin, dem Benutzer den Optimistic Lock Error / Exception zu melden.

Das Problem ist, dass es nicht skalierbar ist. Angenommen, ich habe viele Benutzer, die wahrscheinlich mit derselben Aktion eine Sperre auslösen. Der Benutzer kümmert sich nicht um die Sperrfehlermeldung.

Auf den Punkt gebracht:

  • Der beste Weg ist, alle Sperren zu deaktivieren?
  • Der beste Weg besteht darin, dem Benutzer die Fehlermeldung zu melden. Aber der Benutzer muss seine Aktion wiederholen, bis es funktioniert!
  • Der beste Weg ist, die Transaktion zu wiederholen, bis keine Sperre mehr besteht?

*

  

Behandlung optimistischer Sperrenausnahmen

     

Leider können Programmierer oft zu schlau für ihr eigenes Wohl sein. Das erste Problem, das beim Verwenden der optimistischen Sperrung auftritt, besteht darin, was zu tun ist, wenn eine OptimisticLockException auftritt. Die typische Antwort des befreundeten Nachbarschafts-Superprogrammierers ist, die Ausnahme automatisch zu behandeln. Sie werden erstellen Sie einfach eine neue Transaktion, aktualisieren Sie das Objekt seine Version zurückgesetzt, und fusionieren die Daten zurück in das Objekt und wieder begehen sie. Presto Problem gelöst, oder ist es?

     

Damit wird der eigentliche Punkt der Verriegelung tatsächlich zunichte gemacht. Wenn Sie dies wünschen, können Sie auch keine Verriegelung verwenden. Leider wird die OptimisticLockException selten automatisch behandelt, und Sie müssen wirklich den Benutzer über das Problem kümmern. Sie sollten den Konflikt an die Benutzer melden und entweder sagen: „Ihre Entschuldigung, aber ein Bearbeitungskonflikt aufgetreten ist, und sie gehen zu müssen, um ihre Arbeit wiederholen“, oder im besten Fall, aktualisieren Sie das Objekt aus und präsentieren die Benutzer mit den aktuellen Daten und die Daten, die sie eingereicht haben und ihnen helfen, die beiden gegebenenfalls zusammenzuführen.

     

Einige automatisierte Merge-Tools werden die beiden widersprüchlichen Versionen der Daten vergleichen, und wenn keine der einzelnen Felder Konflikt, dann nur die Daten automatisch zusammengeführt werden, ohne die Hilfe des Nutzers. Dies ist das, was die meisten Software-Versionskontrollsysteme tun. Leider ist der Benutzer in der Regel besser in der Lage zu entscheiden, wann etwas ein Konflikt als das Programm, nur weil zwei Versionen der .java-Datei nicht die gleiche Codezeile gibt, bedeutet nicht, änderte sie war kein Konflikt, der erste Benutzer gelöscht haben könnte Methode, zu der der andere Benutzer eine Referenzmethode hinzugefügt hat, und einige andere mögliche Probleme, die dazu führen, dass der nächtlich erstellte Build immer wieder unterbrochen wird.

    
Sandro Munda 26.08.2011, 09:07
quelle

1 Antwort

10

Der Benutzer wird sich um die Nachricht kümmern, da er einige Änderungen vornehmen wollte und die Änderungen nicht vorgenommen wurden. Er wird also die Seite aktualisieren, um den neuen Zustand der Daten zu sehen, und wird seine Modifikationen wiederholen oder entscheiden, dass sie nicht mehr gemacht werden sollten, wenn der neue Zustand gegeben ist.

Ist es ein Problem, wenn zwei Benutzer gleichzeitig ein Objekt ändern und wenn die letzte Änderung gewinnt, unabhängig von der Änderung? Wenn es ein Problem ist, verwenden Sie optimistisches Sperren und informieren Sie Ihren Benutzer, wenn ein Problem auftritt. Es gibt keinen Weg um ihn herum.

Wenn es kein Problem ist, verwenden Sie kein optimistisches Sperren. Die letzte Änderung wird immer gewinnen, wenn die Einschränkungen in Ihrer Datenbank nicht aufgehoben werden. Wenn jedoch gleichzeitige Benutzer die gleichen Daten ändern, führt immer zu Ausnahmen (z. B. weil ein Benutzer eine Entität möglicherweise löscht, bevor ein anderer Benutzer eine Änderung an dieselbe Entität übermittelt).

Das Wiederholen ist keine Option:

  • entweder wird es wieder fehlschlagen, weil es einfach nicht möglich ist, die Änderungen durchzuführen
  • oder es wird gelingen, aber es wird den Punkt besiegen, an dem man optimistisch sein soll.

Ihr Problem könnte mit einer Autoanalogie erklärt werden. Angenommen, Sie möchten ein Auto mit einem Geschwindigkeitsbegrenzer kaufen, um sicher zu gehen, dass Sie das Geschwindigkeitslimit nicht überschreiten. Und nun fragst du: aber die Geschwindigkeitsbegrenzungen sind mir egal. Sollte ich den Geschwindigkeitsbegrenzer nicht immer deaktivieren? Sie können, aber dann wundern Sie sich nicht, wenn Sie von der Polizei erwischt werden.

    
JB Nizet 26.08.2011, 09:41
quelle

Tags und Links