Persistent trotz Rollback?

Status
Nicht offen für weitere Antworten.

Marsman

Bekanntes Mitglied
Hallo Ihr,

ich weiß langsam nicht mehr, wo ich noch suchen soll. Trotz eines Rollbacks aufgrund einer RuntimeException werden die Daten in der Datenbank gespeichert. Warum nur?

Ich habe eine Webapplication mit JSF, Spring, JPA und Hibernate. In einer Methode der Service-Bean schreibe ich einige Datensätze mit getJpaTemplate().persist(track). Dann tritt darin eine von RuntimeException abgeleitete Exception auf. Der Rollback wird ausgelöst. Dies funktioniert laut Logfile auch. Trotzdem befinden sich danach die Daten in der Datenbank. :-(

Code:
@Transactional(readOnly=false)
public void saveFromPlaylist(InputStream is, Volume volume, boolean compilation) throws PlaylistException {
...
getJpaTemplate().persist(track);
...
}

Code:
...
DEBUG: about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
Hibernate: insert into reviews_track (created_on, version, artist, length, number, title, volume_id) values (?, ?, ?, ?, ?, ?, ?)
2009-04-01 21:31:07,734 org.hibernate.jdbc.AbstractBatcher logClosePreparedStatement
DEBUG: about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2009-04-01 21:31:07,750 org.hibernate.transaction.JDBCTransaction rollback
DEBUG: rollback
2009-04-01 21:31:07,750 org.hibernate.transaction.JDBCTransaction toggleAutoCommit
DEBUG: re-enabling autocommit
2009-04-01 21:31:07,750 org.hibernate.transaction.JDBCTransaction rollback
DEBUG: rolled back JDBC Connection
2009-04-01 21:31:07,750 org.hibernate.jdbc.ConnectionManager aggressiveRelease
DEBUG: aggressively releasing JDBC connection
2009-04-01 21:31:07,750 org.hibernate.jdbc.ConnectionManager closeConnection
DEBUG: releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]

Hier meine applicationContext.xml:

Code:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

  <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="database" value="MYSQL" />
        <property name="showSql" value="true" />
      </bean>
    </property>
  </bean>

  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/MyDB" />
  </bean>
  
  <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>

  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>
  
  <tx:annotation-driven transaction-manager="transactionManager" />

  <bean id="trackService" class="de.domain.service.TrackServiceJPAImpl">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>
  ...    

</beans>


Danke für jede Hilfe,

Titus
 
Zuletzt bearbeitet:
M

maki

Gast
(My)Isam Tabellen unterstützen keine Transaktionen, InnoDB schon.

Welche hast du denn? ;)
 

Marsman

Bekanntes Mitglied
Ich fasse es nicht. Es lag tatsächlich an MyISAM. Und ich habe hier Tage nach der Ursache gesucht!!

Eigentlich wollte ich schon länger mal auf InnoDB umstellen. War aber nie dazu gekommen, weil ich noch keine Lust hatte, herauszufinden, wie ich bei MySQL auf dem Linux-Server die Default DB-Engine umstelle.

Vielen Dank!

Titus
 

frapo

Bekanntes Mitglied
Ich fasse es nicht. Es lag tatsächlich an MyISAM. Und ich habe hier Tage nach der Ursache gesucht!!

Eigentlich wollte ich schon länger mal auf InnoDB umstellen. War aber nie dazu gekommen, weil ich noch keine Lust hatte, herauszufinden, wie ich bei MySQL auf dem Linux-Server die Default DB-Engine umstelle.

Vielen Dank!

Titus

Das ist gar nicht so komplex wie man meinen könnte. In my.cnf folgende Zeile einfügen:
Code:
SET default-storage-engine=InnoDB
Natürlich kann man das noch weiter auf seine Bedürfnisse anpassen, hier der Link zur Doku:
MySQL 5.1 Reference Manual :: 13.6 The InnoDB Storage Engine

Gruß
frapo
 

Marsman

Bekanntes Mitglied
Okay, danke.

Was mich bei alle dem noch wundert, ist aber, weshalb die MyISAM-Datenbank den Rollback-Versuch so stillschweigend ignoriert.

Titus
 
M

maki

Gast
Nebenbei bemerkt, es gibt für hibernate einen speziellen MySQl-InnoDb Dialekt, damit erstellt Hibernate dann von Haus aus InnoDB Tabellen und man muss die DB Konfig nicht ändern.
Der einzige Unterschied ist übrigens wie die Tabellen angelegt werden, der Rest ist gleich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C [JPA] Persistent-Unit wird nur in Eclipse erkannt Data Tier 2

Ähnliche Java Themen


Oben