如何正确使用Db.tx()呢?

public void actionx(){
Db.tx(() -> {  …… ……  return true;});
}

参照以上的方法使用,省略号里就是N个SQL操作,发现其中有某个出现异常之后在异常之前的操作被递交了。难道是我的姿势不对?求指导正确姿势

评论区

hzh740053757

2020-11-12 20:39

异常了就return false回滚 不要都return true

车仔2020

2020-11-12 20:42

@hzh740053757 但是我没有try catch异常,按您说法我还应该捕捉异常,并根据异常情况返回true or false,对不?

hzh740053757

2020-11-12 20:48

对的

要输就输给追求

2020-11-12 23:06

有异常事务就不会提交呀

北流家园网

2020-11-13 09:56

这样来用
public Ret doAction(){
final Ret ret = Ret.create();
Db.tx(() -> {
try {

return RetKit.success(ret);
} catch (Exception e) {
return RetKit.fail(ret, e);
}
});
return ret;

}

杜福忠

2020-11-13 10:12

可以看源码:
} catch (Throwable t) {
if (conn != null) try {conn.rollback();}
也就是说,异常肯定会被捕捉,并回滚的。 那就检查一下配置比如事务级别,以及数据库是否支持事务等等:
https://jfinal.com/doc/5-7
注意:MySql数据库表必须设置为InnoDB引擎时才支持事务,MyISAM并不支持事务。

推荐:断点不要打在事务里面容易超时,调试起来一脸懵逼。用日志输出看事务里面执行的情况。

JFinal

2020-11-13 12:13

@杜福忠 同学讲的最详细

关键点:
1:有异常会被回滚(注意自己不要吃掉异常,要让异常向外抛出)
2:自己 try catch 异常的时候,注意在 catch 中 return false
3:return false 会回滚
4:如果上面的都满足,还是没回滚。 应该是事务级别太低了,通过 ar.setTransactionLevel(int) 配置一下, 一般设置为 4 就可以了, 设置成 8 性能会很低

最后我还碰到过一种情况,开发者自己不小心,其实提交的数据是上次调试就已经提交的,程序实际上没问题

JFinal

2020-11-13 12:15

简单来记就一句: 如果最终 return true 执行完毕才提交事务, 其它情况都会回滚(异常/return false)

车仔2020

2020-11-13 14:38

@JFinal “最后我还碰到过一种情况,开发者自己不小心,其实提交的数据是上次调试就已经提交的,程序实际上没问题 。”貌似我也遇到这个问题了~今天已经重现不了之前出现的情况~

JFinal

2020-11-13 17:03

@车仔2020 开发者不小心的这种情况碰到过很多次,常见

热门反馈

扫码入社