想要求教一下,jfinal的事务,@Before(Tx.class)问题

jfinal的事务,在Controller 的方法上面加上@Before(Tx.class)注解,service层try catch了,出现异常了,事务不起作用,该怎么解决呢。

1.png2.png

评论区

JFinal

2020-10-30 11:20

Tx 拦截器是靠异常感知并提交/回滚事务的,所以 serice 内部不能吃掉异常

一般有下面几个办法:
1:使用Db.tx 做事务
Db.tx( () -> {
数据库操作在此
});

2:业务层向外再抛出异常

JFinal

2020-10-30 11:21

我自己的项目,只要是事务,全都用的 Db.tx(...) , 使用 JDK 8 的 lambda 省代码,写起来方便,控制异常也方便

jfinal爱好者22

2020-10-30 11:27

@JFinal 好的。另外,去掉 service层的 try catch,事务也没有回滚,我在controller的方法上面事务注解了,是什么原因呢

lyh061619

2020-10-30 11:32

@jfinal爱好者22 通过try catch捕获异常后要用throw e往上抛,这样在controller层使用事物注解才能触发事物及回滚。

jfinal爱好者22

2020-10-30 11:45

@lyh061619 好的,明白。还是用Db.tx(...)吧。方便些

jfinal爱好者22

2020-10-30 17:31

@JFinal Db.tx(...) 里面的代码出现异常,请求就终止了。如果我还想让,controller 返回 错误的状态码code或msg信息该怎么办?

JFinal

2020-10-30 17:39

@jfinal爱好者22 Db.tx 里面可以用 try catch , catch 中可以处理错误信息,然后 return false 即可回滚事务

jfinal爱好者22

2020-10-30 18:28

@JFinal 是的,我就是这么做的,Db.tx 里面可以用 try catch,return false,事务回滚了。控制器renderJson(returnData);不返回了啊