Hallo Forianer,
brauche dringend Hilfe - mache an dem Problem jetzt schon Tage 'rum.
Habe im Buch wieder und wieder gelesen. Vielleicht steh`ich ja nur auf dem Schlauch...
In meiner Anwendung gibt es eine Klasse Fix, die für optimistic locking folgendes Feld hat:
Code:
private int version;
Wenn man folgenden code ausführt...
Code:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
List fixes = session.createCriteria(Fix.class).list();
tx.commit();
session.close();
...macht Hibernate folgende SQL Aufrufe (select liefert drei Fix-Objekte zurück):
Code:
Hibernate: select this_.FIX_ID as FIX1_0_, ... from FIX this_
Hibernate: update FIX set VERSION=?, ... where FIX_ID=? and VERSION=?
Hibernate: update FIX set VERSION=?, ... where FIX_ID=? and VERSION=?
Hibernate: update FIX set VERSION=?, ... where FIX_ID=? and VERSION=?
...die dazu führen, dass der "version" counter aller Fix-Objekte inkrementiert wird. Dadurch verhält die Anwendung sich so, als ob diese Objekte updated worden wären.
Der update wird durch tx.commit() ausgelöst.
Warum führt Hibernate in dieser Situation den update aus?
Die Anwendung hat doch gar kein session.update() gemacht!
Ist das ein Fehler, oder übersehe ich da 'was?
(Das Verhalten habe ich bei allen isolation levels (1, 2, 4) beobachtet).
Das Problem mit dem o.g. Verhalten ist, dass einer von zwei Clients, die diesen code concurrent ausführen, eine StaleObjectStateException bei Transaction.commit() bekommt, obwohl beide nur lesen!
Hibernate version: 3.0.5
Apache Derby, 10.0.2.0