: O. Yuanying

Transactionがロールバックされない!

Spring+Hibernate+MySQLを利用してデータベースプログラミングしてるのだけど、なぜかトランザクションがロールバックされない。

とりあえずテストのために以下のようなコードを書いた。

@Transactional(propagation=Propagation.REQUIRED)
    public Blog createBlog(Blog blog) {
        Integer id = (Integer) this.getBlogDao().save(blog);
        List list = this.getBlogDao().find("where id=?", new Object[] {id});
        throw new RuntimeException("test");
        //return list.get(0);
    }

んでTransactionManagerのログをデバッグレベルにして出力してみる。

[DEBUG] hibernate3.HibernateTransactionManager [getTransaction:253] Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@1eeffa]
[DEBUG] hibernate3.HibernateTransactionManager [getTransaction:280] Creating new transaction with name [jp.fraction.rana.service.BlogService.createBlog]
[DEBUG] hibernate3.HibernateTransactionManager [doBegin:449] Opened new Session [org.hibernate.impl.SessionImpl@1d1bb0] for Hibernate transaction
[DEBUG] hibernate3.HibernateTransactionManager [doBegin:462] Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@1d1bb0]
[DEBUG] hibernate3.HibernateTransactionManager [doBegin:534] Exposing Hibernate transaction as JDBC transaction [com.mysql.jdbc.Connection@9b6540]
Hibernate: insert into blogs (user_id, title, description, url, path, time_zone, locale) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: select blog0_.id as id0_, blog0_.user_id as user2_0_, blog0_.title as title0_, blog0_.description as descript4_0_, blog0_.url as url0_, blog0_.path as path0_, blog0_.time_zone as time7_0_, blog0_.locale as locale0_ from blogs blog0_ where blog0_.id=?
[DEBUG] hibernate3.HibernateTransactionManager [triggerBeforeCompletion:669] Triggering beforeCompletion synchronization
[DEBUG] hibernate3.HibernateTransactionManager [processRollback:577] Initiating transaction rollback
[DEBUG] hibernate3.HibernateTransactionManager [doRollback:599] Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@1d1bb0]
[DEBUG] hibernate3.HibernateTransactionManager [triggerAfterCompletion:693] Triggering afterCompletion synchronization
[DEBUG] hibernate3.HibernateTransactionManager [doCleanupAfterCompletion:659] Closing Hibernate Session [org.hibernate.impl.SessionImpl@1d1bb0] after transaction
[ERROR] servlet.DispatcherServlet [processRequest:412] Could not complete request
java.lang.RuntimeException: test
	at jp.fraction.rana.service.impl.BlogServiceImpl.createBlog(BlogServiceImpl.java:24)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:335)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:181)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
	at $Proxy30.createBlog(Unknown Source)

えー、rollbackされてるじゃーん。なのに何でデータベースのレコードが増えてるの!!

意味不明。誰かボスケテ!