首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
想要求教一下,jfinal的事务,@Before(Tx.class)问题
jfinal爱好者22
2020-10-30 11:18
jfinal的事务,在Controller 的方法上面加上@Before(Tx.class)注解,service层try catch了,出现异常了,事务不起作用,该怎么解决呢。
项目:
JFinal
2
评论区
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);不返回了啊
回复
发送
我要反馈
热门反馈
扫码入社
一般有下面几个办法:
1:使用Db.tx 做事务
Db.tx( () -> {
数据库操作在此
});
2:业务层向外再抛出异常