2010-12-29 2 views
2

Ich studierte über optimistic locking in JPA, das Hinzufügen @Version annotation mit Versionsspalt in DB und wie es durch EntityManager etcIst es möglich, optimistisches Sperren in JPA toplink auf Spaltenebene zu spalten?

Die Doc sagt (in meinem eigenen Wort) optimistische Sperre ist wirksam bei der Objektebene verwaltet wird. Ich kann sagen, es ist in der Tat so, weil die Versionsdefinition in der Entitätsklasse sitzt.

Das bedeutet:

  1. userA wählen row_A (nur eine Zeile in der Tabelle db)

  2. userB wählen row_A

  3. userA aktualisieren row_A von Benutzernamen Spalte (Version Änderungen hier)

  4. BenutzerB update row_A der Spalte Benutzername (optimisticLockException ausgelöst)

So weit so gut.

Aber etwa bei step4 denken, wenn

userB update row_A of phoneNumber zum Beispiel.

Ich weiß, optimisticLockException wird immer noch geworfen, aber gibt es eine Möglichkeit, nach Spaltenebene statt Objekt-Ebene zu sperren?

Für mich wäre es schön, eine Sperre auf Spaltenebene zu haben, aber ich bin mir auch nicht sicher, welchen Nachteil das bringen würde, obwohl es möglich ist.

Antwort

2

Nein. Denken Sie daran, dass JPA nur Objekte in die zugrunde liegende relationale Datenbank mappt. Daher ist jeder Datensatz (Zeile) in einer Tabelle eine Instanz eines Objekts.

Datenbanken sperren normalerweise Datensätze und keine Spalten. Das Sperren einer ganzen Spalte ist fast wie eine exklusive Sperre für einen Tisch.

1

Ich kann die Verwendung dieser Art der Sperrung sehen, aber es würde die Atomizität der Datenbankaktualisierung verletzen. Stellen Sie sich vor, ich schreibe eine Bank-Anwendung, wo die Leute Salden und Überziehungslimits haben. Sagen wir, ich beginnen mit:

Customer | Balance | Overdraft Limit 
Shirakawa | -30000 |   -50000 

Dann Shirakawa-san zusammen und macht auf einmal zwei Transaktionen kommt, über verschiedene Kassierern; mit einem zieht er 15000 Yen zurück und mit dem anderen reduziert er das Überziehungslimit auf 40000 Yen. Jede dieser Transaktionen ist für sich vollkommen in Ordnung und würde keine Einschränkungen in der Geschäftslogik verletzen. Aber das Ergebnis ist:

Customer | Balance | Overdraft Limit 
Shirakawa | -45000 |   -40000 

Uh-oh.

Ich gebe zu, das ist ein künstliches Beispiel. Dies ist jedoch der allgemeine Grund, warum gleichzeitige Aktualisierungen auf Spaltenebene nicht unterstützt werden.

Sie können jedoch die gleichzeitig aktualisierbaren Teile des Datensatzes in separate Einheiten ausgliedern und separat aktualisieren.Um das auf das obige Beispiel anzuwenden, haben wir eine Konto-Tabelle, wie oben, und auch eine Überziehungs-Vereinbarungstabelle mit einer Eins-zu-eins-Beziehung. Dann hätten wir:

Customer | Balance 
Shirakawa | -45000 

Customer | Overdraft Limit 
Shirakawa |   -40000 

Und wir könnten diese parallel aktualisieren. In diesem Fall wäre das eine schlechte Idee, aber es könnte für Sie nützlich sein.

+0

Ich mag das Teil, um die Verarbeitung auch separat zu machen. Danke für das Beispiel! –

2

Die akzeptierte Antwort ist nicht ganz richtig. Dies gilt jedoch auch für die JPA-Ebene auf Java-Ebene. Sie können jedoch die providerspezifische Funktionalität nutzen, um Sperren auf Spaltenebene zu erhalten. Zum Beispiel unterstützt Eclipselink, der Standardanbieter in Glassfish 3.0+, optimistische Sperrenerweiterungen, die eine größere Flexibilität in diesem Bereich bieten.

Siehe Eclipselink JPA Extensions for Optimistic locking

auch

Optimistic Version Locking Policies and Cascading

Einzelheiten zu optimistisch Feld Politik für Eclipse sperren.

2

Ich stimme @NBW und @jbx völlig falsch. Laut dem Artikel this unterstützt EclipseLink viele Sperrrichtlinien und Sie können Sperren auf Spaltenebene (Feldebene) verwenden. Ja, JPA unterstützt nicht, aber manchmal mussten wir solche nicht standardmäßigen Funktionen verwenden, und hier hilft EclipseLink. Schließlich sperrt EclipseLink die Spaltenebene nicht, sondern aktualisiert den Wert auf sichere Weise. Überprüfen Sie den Artikel und das Beispiel für weitere Informationen.

Nizza Artikel über die Verriegelung ist here.

Verwandte Themen