今天碰到一个问题是关于spring+hibernate+mysql配置了事务后抛异常无回滚的情况。
代码:
事务配置:
Xml:
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" propagation="NOT_SUPPORTED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="within(com.javalong.ssh.dao.*)" id="userPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="userPointCut"/>
</aop:config>
Dao:
@Override
public void insert(User user) throws RuntimeException{
this.getHibernateTemplate().save(user);
}
Main:
ApplicationContext context=new ClassPathXmlApplicationContext("ssh.xml");
UserDao userDao=(UserDao)context.getBean("userHibernateImpl");
User user=new User();
user.setEmail("840727854@qq.com");
user.setPassword("123");
user.setPhone("12345678");
user.setUsername("ygh");
userDao.insert(user);
就是非常简单的测试代码。
首先先演示下情况
正常插入:
运行成功。插入一条数据。
下面再insert方法中抛出RuntimeException;
代码:
@Override
public void insert(User user) throws RuntimeException{
this.getHibernateTemplate().save(user);
throw new RuntimeException("坏了");
}
其他都不变。
运行:
虽然报错了,但是,我们发现数据库还是增加了一条数据。。。
事务配置肯定是没问题的。
百度了下也没发现什么有用的信息。。
后来突然想到,mysql的Innodb才是支持事务的,我创建表的时候好像是用默认的引擎了。
Show create table t_user:
确实,数据库引擎是MyISAM ,这个是不支持事务的。
重新建个表t_user2,数据库引擎用InnoDB.
果然不负我所望。
可以回滚。