Spring事务回滚问题

Spring事物,在service层注入事物,进行两个insert操作,在service方法中要自己抛出异常然后指定回滚吗?还是一个insert没有成功自己也不用抛出异常就会回滚吗?
这里使用mybatis的代理dao实现,insert失败时会有提示或异常抛出吗

阅读 5.7k
5 个回答

如果有编译异常抛出就可以 不可以自己捕获处理 你既然用了spring框架 ,自己捕获并处理了异常,框架不会帮你回滚了,前提是你在spring配置文件里边配置了事务的回滚策略同意一楼所说默认运行异常回滚,事务是加在service层的,你那两个insert方法本身并没有事务,所以不需要考虑传播行为。

使用@Transaction(rollbackFor=Throwable.class)注解到Service类上或具体的方法上,需要注意的是@Transaction注解默认只对RuntimeException异常捕获并回滚,也就是说如果你抛出的是Exception异常将不进行回滚,所以要记得加上rollbackFor=Throwable.class指定所有的异常都进行回滚

同意@正能量前线的答案,并且补充下,如果在一个方法中进行多次操作,需要考虑事务的传播范围,当然默认是 propagation = Propagation.REQUIRED,意思是说: 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.

看了前面前面两位的回答,我再补充下。在Spring事务默认是基于接口的JDK代理。所以在你的Service层调用的两个insert方法,如果insert也是service层方法,那必须是接口方法,如果是私有方法,则私有方法不会回滚。还要注意多线程情况下的事务问题。

我现在也是这个疑问,看了前面四个回答感觉没有回答到点上,疑问是mybatis进行CRUD出错,代理dao会不会自己抛出异常,目前我测试是一个错了没反应没有回滚,错的就没有插入数据库。那我该怎么判断出错并把错误具体异常抛出去

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏