-->
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.  [ 3 posts ] 
Author Message
 Post subject: Rollback funktioniert nicht richtig
PostPosted: Wed Jan 25, 2012 5:54 am 
Newbie

Joined: Thu Feb 18, 2010 8:56 am
Posts: 4
Hallo,
ich verwende Hibernate 3.4.
Neulich habe ich beim Testen festgestellt, dass Rollback von Hibernate nicht funktioniert.
In der Konfigurationsdatei habe ich autocommit auf false eingestellt.
Code:
<property name="hibernate.connection.autocommit">false</property>

Ich verwende native SQL. Es werden mehrere Statements nacheinander ausgeführt.
Code:
try{
transaction = session.beginTransaction();
query1.executeUpdate();
query2.executeUpdate();
query3.executeUpdate();
transaction.commit();
}catch(HibernateException he){
transaction.rollback();
}

Ich habe erwartet, dass dies alles oder nichts Prinzip verfolgen soll.
Leider stelle ich fest, dass nach jeder executeUpdate() Anweisung, die Daten in der Datenbank persistiert werden. Wenn ein Fehler beim query2 auftritt, wird query1 gar nicht rückgängig gemacht.
Frage: Hat das mit autocommit was zu tun? Ist was mit der Konfiguration nicht in Ordnung? Muss ich autocommit programmatisch explizit auf false setzen?
Bin für jeden Vorschlag dankbar.
Gruß,
Ming


Top
 Profile  
 
 Post subject: Re: Rollback funktioniert nicht richtig
PostPosted: Wed Jan 25, 2012 8:57 am 
Senior
Senior

Joined: Tue Oct 28, 2008 10:39 am
Posts: 196
Welche DB? Bist du sicher, dass ein Fehler auftritt? Warum gibst du uns die Exception nicht zusammen mit ein paar zusätzlichen Details?


Top
 Profile  
 
 Post subject: Re: Rollback funktioniert nicht richtig
PostPosted: Thu Feb 09, 2012 6:52 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Quote:
Leider stelle ich fest, dass nach jeder executeUpdate() Anweisung, die Daten in der Datenbank persistiert werden.

Was verstehst Du genau unter 'persistiert' ?
Man muss naemlich zwischen flush und eigentlichen commit unterscheiden.

Bei einem Flush werden alle anstehenden Aenderungen auf die Datenbank uebertragen (d.h. die updates werden ausgefuehrt).

Wahrscheinlich wird bei jedem deiner updates auch implizit ein flush ausgefuerht, da dies dem default entspricht und Du nicht explizit
Code:
query2.setFlushMode(FlushMode.COMMIT);

vor dem Ausfuehren gesetzt hast.

Aber mit einer sinnvoll gewaehlten Isolation z.B. COMMITTED_READ sehen andere DB-User diese Aenderungen noch nicht,
erst wenn sie auch commited sind.


Um zu sehen was wirklich passiert, empfehle ich Dir waermstens alle JDBC-Statements mit einem JDBC-logger z.B. P6spy zu loggen,
damit siehst Du genau wann, wie, innerhalb welcher Transaktion, was ablaeuft und ob die Transaktion am Ende commited oder zurueckgerollt wird.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.