Transactionがロールバックされない!
Spring+Hibernate+MySQLを利用してデータベースプログラミングしてるのだけど、なぜかトランザクションがロールバックされない。
とりあえずテストのために以下のようなコードを書いた。
@Transactional(propagation=Propagation.REQUIRED) public Blog createBlog(Blog blog) { Integer id = (Integer) this.getBlogDao().save(blog); Listlist = 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されてるじゃーん。なのに何でデータベースのレコードが増えてるの!!
意味不明。誰かボスケテ!