JFianl3.3 关于try catch事务无效。

  1. 方法(函数)包含多个save或update数据库操作,加入@Before(Tx.class),确保事务,如下图

    2.jpg

  2. 刻意制作错误,如类型转换错误。

    0.png

  3. 报错后查看数据库,发现上述的insert都执行,Tx事务无效,然后各种怀疑人生。

  4. 后修改代码,事务的方法体内不含有try..catch,事务成功。

    1.jpg

评论区

dafeizi

2018-01-25 10:49

https://jingyan.baidu.com/article/6525d4b180ee42ac7c2e9460.html
和Spring事务类似,,若要使用try..catch可以使用抛出runTime异常。

JFinal

2018-01-25 13:10

@Before(Tx.class) 是感知到异常以后,才回滚事务,当你自己的代码中有 try catch,并吃掉了 Exception 不再向上抛出时,上层的 Tx 拦截器是感知不到的

建议用 Db.tx(....) 来做事务,可以通过 return false 来控制事务回滚

dafeizi

2018-01-25 15:33

@JFinal 该方法用于API 执行并返回Json格式;但目前代码报错后不能获取异常(因为try..catch影响事务),不能执行返回错误时的JSon。有什么解决方案?

JFinal

2018-01-25 15:49

@dafeizi 用 Db.tx(...) 做事务,然后 return false 回滚就可以了

dafeizi

2018-01-25 16:04

* Db.tx(new IAtom(){

* public boolean run() throws SQLException {

* int result1 = Db.update("update account set cash = cash - ? where id = ?", 100, 123);

* int result2 = Db.update("update account set cash = cash + ? where id = ?", 100, 456);

* return result1 == 1 && result2 == 1;

* }});

是否只能支持 Db.update()等Db的方法?上文中自定义的xxx.dao.xxx是否不可使用?

JFinal

2018-01-25 16:22

@dafeizi 都可以使用,注意如下几点:
1:所有数据库操作需要是针对同一个数据源的,不能一行代码针对数据源a,另一行针对 b
2:Db.tx 也要与内部数据库操作的那些代码指向同一个数据源。本条与第一条如果使用的是默认数据源,则不需要关注
3:注意事务级别要与你当前的 sql 匹配,jfinal 默认为你设置成为了 4

热门反馈

扫码入社