素材牛VIP会员
Global transaction rollback but transactional code commit?
 青***8  分类:Java代码  人气:1484  回帖:1  发布于6年前 收藏

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

第二个文件:

第三个文件:

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

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

现在不解的是debug的信息:

一、当第二个文件有@Transactional修饰时:
debug信息大致如下:
1、Creating new transaction with name [org.ibond.bpm.test.service.AATESTManagerService.insertData2]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-1
--->
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7] 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 [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7] rollback-only
9、Transactional code has requested rollback【第三个文件】
10、Participating transaction failed - marking existing transaction as rollback-only
11、Setting JDBC transaction [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7] 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 [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7]
整体的大致关键的Debug顺序就结束了。

二、当第二个文件无@Transactional时
1、Creating new transaction with name [org.ibond.bpm.test.service.AATESTManagerService.insertData2]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-1
--->
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7] 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 [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7] rollback-only
8、Transactional code has requested rollback
9、Initiating transaction rollback
10、Rolling back JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@408013b7]

可以看出日志唯一不同点就是:
一的:
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

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

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

 标签:java

讨论这个帖子(1)垃圾回帖将一律封号处理……

Lv1 新人
wx***73 移动开发工程师 6年前#1

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取