# Allgemeine Vorgehensweise Locking



## prime (12. Jul 2012)

Hallo,

ich habe eine kleine Anwednung geschrieben, welche auf einem JBoss 7 läuft.
Nun kann es natürlich sein, das der Benutzer A ein Objekt läd, danach Benuzter B undn natürlich erst A und dann B speichert.
Wie geht man allgemein damit um?

Natürlich könnte ich jedes Objekt mit einem lock-flag versehen und diese manuell testen.
Gibt es eine besser Lösung? Kann ich das vll mit Hilfe von JPA definieren und JSF zeigt dem Benutzer dann die Meldung an?

Danke schon mal für eure Hilfe.


----------



## tfa (12. Jul 2012)

JPA bietet _optimistic Locking_ (@Version-Annotation):
Java Persistence/Locking - Wikibooks, open books for an open world


----------



## prime (12. Jul 2012)

Danke für die schnelle Antwort.

Ich habe versucht in meiner DAO mit

```
entityManager.lock(geladeneEntity, LockModeType.READ);
```
zu sperren.

Wenn ich aber mit einem anderen User die gleiche Entity laden will, funktioniert dies ohne Exception.
Was habe ich nicht bedacht?


----------



## prime (12. Jul 2012)

Ich kann irgendwie meine Beiträge nicht editieren.
Der Code sollte natürlcih folgender sein:

```
entityManager.lock(geladeneEntity, LockModeType.PESSIMISTIC_WRITE);
```


----------



## nillehammer (12. Jul 2012)

> Wenn ich aber mit einem anderen User die gleiche Entity laden will, funktioniert dies ohne Exception.
> Was habe ich nicht bedacht?


Ich habe bisher immer nur mit Optimistic Locking und Version-Feld gearbeitet. Deswegen beruht meine Antwort nicht auf Erfahrung, sondern nur auf meinem Verständnis der Dokumentation. Wenn ich diese richtig verstehe, Enden locks je nach Art schon bei Ende der zugehörigen Transaktion bzw. spätestens, wenn der EntitManager endet. Ich nehme mal an, dass eins davon bei Dir der Fall ist.

Ein Lock endet also autmomatisch und muss nicht manuell entfernt werden. Im EntityManager-Interface gibt es darum auch keine unlock-Methode.


----------



## prime (13. Jul 2012)

Mit Optimistic Locking wird wie erwartet eine Exception geworfen.
Ich steuerer die Conversation manuell in einem Conversation Scope.

Ich denke auch, dass der Lock wohl zu früh automatisch gelöst wird.
Ich danke dir.


----------

