事务回滚不了,求帮忙看一下

blob.png

blob.png

blob.png

之前在Tx.class 打断点看是走到 这里的

blob.png

但是数据没有回滚

评论区

JFinal

2017-08-28 11:33

首先通过设置断点,单步调试,看代码有没有执行 conn.rollback() 这个方法,如果执行了,只需要确保以下几件事就可以了:
1:mysql 是不是在用 InnoDB 引擎,其它引擎不支持事务
2:事务级别是否足够高,如果是 2 的话,建议调为 4 看一下:arp.setTransactionLevel(4)
3:是不是不细心,上次提交过的已成定局的数据,误认为是本次事务没有回滚

ze

2017-08-28 13:05

@JFinal 额,我确定的是您说的1和3都没问题,但是事务级别的话我不是很清楚怎么看是不是2或者多少?

ze

2017-08-28 13:08

@JFinal 是在config链接c3p0连接arp的时候设置是吗?

JFinal

2017-08-28 13:23

@ze 你 new 出来的 ActiveRecordPlugin 对象就是 arp 了,new 出来以后,直接配置一下

ze

2017-08-28 13:27

@JFinal 我加上了“arp.setTransactionLevel(4)“,还是不行,我有一个疑问的是:这种多表插入的操作,像现在我打断点跑,执行到menu表的save(),和resource表的save()方法,然后去刷新数据库,数据添加进去了,然后往下执行,跑到报错的地方,再然后跳到“Source not found.”,再按3次F6,跳进MethodProxy.class的catch (InvocationTargetException arg3),后面到Invocation.class的catch (RuntimeException e),最后到这来:catch (Throwable t) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}

ze

2017-08-28 13:28

@JFinal AutoTableBindPlugin arp =
new AutoTableBindPlugin(PropKit.get(ConstantInit.DB_DATASOURCE_MAIN), yimei);
arp.autoScan(false);
String yimeiPackage = PropKit.get(ConstantInit.CONFIG_SCAN_YIMEI_PACKAGE);
arp.addScanPackages(yimeiPackage);
me.add(arp);
arp.setTransactionLevel(4);这个加上了也不行

JFinal

2017-08-28 13:55

@ze 你确定 conn.rollback() 这行代码被执行了?

ze

2017-08-28 14:08

@JFinal 是的,我跑了几遍断点都走过了这个catch (Throwable t) {
if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}
throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t);
}然后都往下走finally了

JFinal

2017-08-28 14:10

@ze 这个问题很诡异,建议多单步调试找原因,在我们这里都是很好用的,jfinal 的这个功能用了五六年了

ze

2017-08-28 14:14

@JFinal 好的,我找我主管来看下,谢谢了

JFinal

2017-08-28 14:16

@ze 记得搞定后回来分享一下,这个问题相当罕见

ze

2017-08-28 14:18

热门反馈

扫码入社