spring4的jdbctemplate事务不起作用【已解决】

spring4的jdbctemplate事务不起作用【已解决】

明媚如初 发布于 2021-11-28 字数 4164 浏览 809 回复 2

完整测试项目上传到网盘了【该版本Dao层update方法有bug,不应该try catch,否则无法触发biz层的rollback】:http://pan.baidu.com/s/1o6Nzi1W

经过一番折腾研究和分析,原来配置文件都没问题,问题出在代码逻辑上,还有个问题猜测与数据库有关系。

最新update:重新经过一番调试,发现自己代码写错了,在dao层把异常给try catch掉了,因此虽然sql执行错误,但是在biz层因为没接收到异常,所以依旧commit了,后来删除dao层的try catch则正常回滚了。总结一下就是想要触发rollback生效必须要切入的方法(biz方法)抛出异常才行。但是还有另外一个问题就是在事务没有doBegin和doCommit的情况下,update等操作依旧自动提交了,这个是与数据库设置有关系么?

我重写了spring的DataSourceTransactionManager类,在每个方法执行前打印一句方法名方便调试

junit单元测试打印的结果如下

--------------------------不华丽的分割线----------------------------

txManager:setDataSource
txManager:afterPropertiesSet
txManager:getDataSource
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:55

txManager:doGetTransaction
txManager:isExistingTransaction
>>>>>>>>>>>>>>>>事务测试,select开头的方法应该不开启事务,插入操作应该不提交
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:56

txManager:doGetTransaction
txManager:isExistingTransaction
txManager:doBegin
txManager:getDataSource
>>>>>>>>>>>>>>>>回滚测试,遇到异常应该所有的操作都回滚,不管是aop还是annotation都应该要回滚
txManager:doRollback
txManager:doCleanupAfterCompletion
PreparedStatementCallback; SQL [insert into test(id) values(2)]; Field 'name' doesn't have a default value; nested exception is java.sql.SQLException: Field 'name' doesn't have a default value
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:56

--------------------------不华丽的分割线----------------------------

下面是之前的调试结果,上面是最新的调试结果解决了rollback的问题

--------------------------不华丽的分割线----------------------------

txManager:setDataSource
txManager:afterPropertiesSet
txManager:getDataSource
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:44

txManager:doGetTransaction
txManager:isExistingTransaction
>>>>>>>>>>>>>>>>事务测试,select开头的方法应该不开启事务,插入操作应该不提交
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:45

txManager:doGetTransaction
txManager:isExistingTransaction
txManager:doBegin
txManager:getDataSource
>>>>>>>>>>>>>>>>回滚测试,遇到异常应该所有的操作都回滚,不管是aop还是annotation都应该要回滚
################数据库操作异常PreparedStatementCallback; SQL [insert into test(id) values(2)]; Field 'name' doesn't have a default value; nested exception is java.sql.SQLException: Field 'name' doesn't have a default value
txManager:doCommit
txManager:doCleanupAfterCompletion
txManager:doGetTransaction
txManager:isExistingTransaction
================当前数据库总条数:46

--------------------------不华丽的分割线----------------------------

疑问点一:可以看到当执行biz中select开头的方法虽然执行了doGetTransaction和isExistingTransaction,但是没有执行doBegin和doCommit,结果在这个biz的方法中执行的数据库update语句也提交了,没有事务应该不会提交才对。【未解决】

疑问点二:在biz中add开头的方法,执行了doBegin和doCommit方法,但是方法里面是有sql异常的,却没有回滚,这又是什么原因呢? 【已经解决】

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

等风来 2021-12-01 2 楼

问题基本上解决了。感谢

皇甫轩 2021-12-01 1 楼

控制器一定要单独扫描,这个我看怎么有点不对劲。