请教:有没有办法让controller中的普通方法的事物生效

图片.png

如上图,savaDB是个controller中的一个普通方法,我想用注解的方式让它的事物可以生效。@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 都可以

热门反馈

扫码入社