【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)

1、Mybatis-Spring配置

【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)

2、测试代码

【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)
在上图代码151行运行完后,在154行跑出了RuntimeException,但是数据依然提交到了MySQL,没有回滚

3、说明:
mysql的autocommit功能已经关闭

4、疑问:

1)为什么上述测试抛出了一场数据没有回滚?

2)我把切面的切点方法名称如method="add"改成method="badd",数据还是会提交,而且不回滚,按理说,切面没切到是没有事物的,即使junit跑的过程中数据添加成功了,跑完后数据应该还是没提交的状态。因为不用切面Mybatis只能单独用SqlSession的事物,前提是需要自己声明。

5、日志:
1)切面,method="add"

日志:

【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)

异常:

【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)

2)不用切面,method="badd",可以看到下图日志中并没有commit日志

【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试)

回答

额 你在织入的方法中出错好不好,你这样抛错当然不回滚

第151行代码:ResponseVo = iUserService.addOneUser(user);
Runtime ExceptioniUserService#addOneUser方法里抛出,才会触发事务回滚,由于这里没有贴出这个方法内的代码,所以也不好判断。

事物都已经提交了,在service里面抛出

你的切面是server层add方法 你在test方法里面抛异常,事务早就已经执行完了,请到server.add方法里面抛异常。

以上是 【Java】关于MyBatis通过Spring切面做事物管理的问题(抛出了异常却不回滚,切面没切到也提交了,用Junit测试) 的全部内容, 来源链接: utcz.com/a/90852.html

回到顶部