2
回答
关于JFinal事务的问题
注册华为云得mate10,2.9折抢先购!>>>   

@JFinal 你好,想跟你请教个问题:如下代码

public class ArticleController extends Controller {
@Before(Tx.class)
private void addPoint(String userId) {
Point point = new Point(); point.save();//假设这个执行成功,step 1  
Log log = new Log();log.save();//假设这个执行失败,step 2   
}


当我没有在JFinalConfig 中配置下面的代码的时候

public void configInterceptor(Interceptors me) {
    me.add(new Tx());
}

step1 的操作对数据库写入了数据,step 2的操作没有写入数据,没有发生回滚。

当我JFinalConfig 中配置下面的代码的时候,step1 和step2 操作均没有成功。

这是怎么回事呢?


举报
badouyuren
发帖于3年前 2回/234阅
共有2个答案 最后回答: 3年前

    有没有配置JFinalConfig中的 Tx 拦截器执行结果都应该是一样的,因为jfinal中的嵌套事务最终是被融入到一个事务中的。而被认为会不一样应该是不细心的原因:将多次试验时的结果搞混淆了诸如此类。

    事务回滚与代码怎么写有一定的关系,例如有些人喜欢将数据从库里面先读到内存然后在内存在修改值,再将数据写入数据库,这类操作的事务级别需要为4。具体到楼主的业务,事务级别提升到4应该可以保证事务回滚。

好奇怪啊,当我配置JFinalConfig了,就可以保证。
当我@Before(Tx.class),这样就保证不了。

而且同样的代码,当我这样写的时候,就可以保证如果出错的时候,会发生回滚。

  public boolean addPoint() {

        boolean isSucceed = Db.tx(new IAtom() {
            public boolean run() throws SQLException {
                Point point = new Point();
                boolean result1 = point.save();//修改用户积分
                Log log = new Log();
                boolean result2 =  log.save();//用户积分修改日志

                return result1 && result2;
            }
        });

        return isSucceed;
    }



--- 共有 1 条评论 ---
CapJes为了保证没问题,JFinal的事务,我基本上都是这样写的。用注解方式,在使用过程中遇到过问题,也是发现事务没有回滚。 2年前 回复
顶部