【java】Global transaction rollback but transactional code commit?

代码结构相对简单,就以图的形式展示出来了。。。。。。
三个文件的事务传播属性都是默认的Propagation.REQUIRED,隔离界别、超时时间、是否只读也都是默认的。
@Transactional(rollbackFor=Exception.class)
第一个文件:

【java】Global transaction rollback but transactional code commit?

第二个文件:

【java】Global transaction rollback but transactional code commit?

第三个文件:

【java】Global transaction rollback but transactional code commit?

调用方式也相对简单,不做过多的阐述了。。。。。。。。[一调用二,二调用三]

REQUIRED的传播属性也了解,当前有事务,则进行合并,当前无事务,则创建一个新的事务。

现在不解的是debug的信息:

一、当第二个文件有@Transactional修饰时:
debug信息大致如下:
1、Creating new transaction with name [org.ibond.bpm.test.service.AATESTManagerService.insertData2]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-1
--->
JDBC Connection [[email protected]] will be managed by Spring
2、Participating in existing transaction 【第二个文件的事务】
3、java.lang.NumberFormatException: For input string: "sss-two"【第二个文件抛出的异常】
4、Participating in existing transaction【第三个文件的事务】
5、java.lang.NumberFormatException: For input string: "sss-three"【第三个文件抛出的异常】
6、Transactional code has requested rollback 【第二个文件】
7、Participating transaction failed - marking existing transaction as rollback-only
8、Setting JDBC transaction [[email protected]] rollback-only
9、Transactional code has requested rollback【第三个文件】
10、Participating transaction failed - marking existing transaction as rollback-only
11、Setting JDBC transaction [[email protected]] rollback-only
12、Global transaction is marked as rollback-only but transactional code requested commit
13、Initiating transaction rollback
14、Rolling back JDBC transaction on Connection [[email protected]]
整体的大致关键的Debug顺序就结束了。

二、当第二个文件无@Transactional时
1、Creating new transaction with name [org.ibond.bpm.test.service.AATESTManagerService.insertData2]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-1
--->
JDBC Connection [[email protected]] will be managed by Spring
2、java.lang.NumberFormatException: For input string: "sss-two"【第二个文件抛出的异常】
3、Participating in existing transaction【第三个文件的事务】
4、java.lang.NumberFormatException: For input string: "sss-three"【第三个文件抛出的异常】
5、Transactional code has requested rollback【第三个文件】
6、Participating transaction failed - marking existing transaction as rollback-only
7、Setting JDBC transaction [[email protected]] rollback-only
8、Transactional code has requested rollback
9、Initiating transaction rollback
10、Rolling back JDBC transaction on Connection [[email protected]]

可以看出日志唯一不同点就是:
一的:
Global transaction is marked as rollback-only but transactional code requested commit
二的:
Transactional code has requested rollback

主要是不太明白为什么会有这样的结果...............,这两种写法到底有什么本质区别,从日志来看,对事务的传播属性都没有影响

不管何种情况,Global transaction都已经设置成rollback的了,但是针对第一种情况,却有 but transactional code requested commit 这里的 transactional code 又是谁......
而为什么第二种情况就没有,而是直接rollback了。

个人理解:
不管哪种情况,对于第一个文件都应该是transactional commit,而第三个文件是transactional rollback,debug显示当前也只有一个transaction,所以个人理解,都应该出现;
Global transaction is marked as rollback-only but transactional code requested commit

但是测试结果却不同..............

还望高人指点一下~,实在看不懂为什么会这样,有疑问也可以留言,共同讨论下~~

回答

重新做了一个测试项目,现已【排除项目原因和一些对测试没必要的配置】,结果一致.........

可以看AbstractPlatformTransactionManager.java里的commit(TransactionStatus status)这个方法。
【java】Global transaction rollback but transactional code commit?

这里面对DefaultTransactionStatus条件的判断可以研究下,我没看过。


这个总结可能对你理解有帮助链接

以上是 【java】Global transaction rollback but transactional code commit? 的全部内容, 来源链接: utcz.com/a/75383.html

回到顶部