-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Hibernate: fehlerhaftes SQL-UPDATE bei optimistic locking?
PostPosted: Wed Jun 29, 2005 8:39 am 
Beginner
Beginner

Joined: Mon Jan 24, 2005 11:33 am
Posts: 24
Location: Stuttgart, Germany
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


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 01, 2005 10:34 am 
Beginner
Beginner

Joined: Mon Jan 24, 2005 11:33 am
Posts: 24
Location: Stuttgart, Germany
Wieso bekomme ich keine Antwort auf meine Frage?
Ist die Problembeschreibung unverständlich?

M.E. geht's kaum einfacher:

Code:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Fix fix = (Fix) session.get(Fix.class, id);
tx.commit();
session.close();


Quote:
Bei tx.commit() macht Hibernate einen SQL-UPDATE, obwohl nur gelesen wird. Das ist der Fehler!


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 01, 2005 10:58 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Du bekommst keine Antwort da Du offensichtlich nichtmal die Schritte die in "Before Posting" gelistet sind gemacht hast:

http://www.hibernate.org/ForumMailingli ... AskForHelp


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 01, 2005 3:45 pm 
Beginner
Beginner

Joined: Mon Jan 24, 2005 11:33 am
Posts: 24
Location: Stuttgart, Germany
christian wrote:
Du bekommst keine Antwort da Du offensichtlich nichtmal die Schritte die in "Before Posting" gelistet sind gemacht hast


Das war ein Wink mit dem Zaunpfahl.
Vielleicht wäre ein Hinweis der Art: "im Hibernate log debug level einschalten und "Before Posting" lesen" auch denkbar gewesen.
Immerhin hat die Antwort aufgerüttelt und letztendlich zum gewünschten Ergebnis geführt.

Nachdem ich im Hibernate log überall den debug level (statt info) eingeschaltet hatte, kam folgende Nachricht:
Code:
DEBUG BasicEntityPersister:2595 - com.ibm.emcf.Fix.state is dirty

Dabei handelt es sich um einen UserType und dort war
Code:
public Object deepCopy(Object value)

falsch implementiert (hat eine Kopie erstellt statt "value" zurückzugeben).
Der Denkfehler war, dass ich diesen UserType als mutable angenommen hatte (deswegen auch das copy).


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 01, 2005 3:48 pm 
Beginner
Beginner

Joined: Mon Jan 24, 2005 11:33 am
Posts: 24
Location: Stuttgart, Germany
kann man übrigens einen post als erledigt markieren?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jul 08, 2005 9:49 am 
Expert
Expert

Joined: Thu Dec 04, 2003 12:36 pm
Posts: 275
Location: Bielefeld, Germany
helwick wrote:
Vielleicht wäre ein Hinweis der Art: "im Hibernate log debug level einschalten und "Before Posting" lesen" auch denkbar gewesen.

Ich glaube, mit dieser Einstellung kommst du hier nicht weit. Warum steht wohl bei jedem Schreiben eines neuen Beitrags, dass man zuvor die Informationen lesen soll?

Schöne Grüße
Sven


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.