首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
请教:有没有办法让controller中的普通方法的事物生效
i++
2018-06-06 10:54
如上图,savaDB是个controller中的一个普通方法,我想用注解的方式让它的事物可以生效。@Jfinal能提供个思路
项目:
JFinal
评论区
JFinal
2018-06-06 11:02
数据库操作有关的代码建议写在业务层,然后业务层做 AOP 支持事务是最好的
还有一个办法是用 lambda 表达式包裹一下:
Db.tx(() -> {
这里是你需要开启事务的代码片段
return false 可以回滚事务,比 Tx 拦截器可控性更好
});
如果你希望可以从上面的包裹代码中得到多个返回值,还可以这样:
Ret ret = Ret.create();
Db.tx(() -> {
ret.set(...);
ret.set(...);
});
回复
i++
2018-06-09 20:27
@JFinal
发现个“问题",不知道算不算BUG。如果捕获了Db.tx(() -> {});代码段的异常,在catch里又不把异常抛出去。发生异常时事务是不会回滚的。代码如下:
try{
Db.tx(() -> {
这里发生异常
return false
});
} catch(){这里不再抛异常}
回复
JFinal
2018-06-09 20:36
@i++
Db.tx 内部已经 try catch 过了,在得到异常时会 rollback 回滚
你展示的这种情况是嵌套事务,也就是说在 Db.tx 外层还有 Db.tx 或者还有 @Before(Tx.class)。 这种情况当然不会回滚,因为这种情况是等着最外层的事务去回滚的
你去掉 Db.tx 外层的事务,就可以正确回滚了,不管外面是不是有 try catch 都可以
回复
发送
我要反馈
热门反馈
扫码入社
还有一个办法是用 lambda 表达式包裹一下:
Db.tx(() -> {
这里是你需要开启事务的代码片段
return false 可以回滚事务,比 Tx 拦截器可控性更好
});
如果你希望可以从上面的包裹代码中得到多个返回值,还可以这样:
Ret ret = Ret.create();
Db.tx(() -> {
ret.set(...);
ret.set(...);
});