jfinal_club如何保证数据库事务安全的?

jfinal club中并没有配置声明式事务,也未使用任何Tx.class注解,那它是如何保证事务安全的呢?我测试过异常情况,不加tx注释,的确不会回滚。

  
    testTx() {
        String loginIp = IpKit.(getRequest());
        Integer accountId = ;


        Project project = Project();
        project.setId();
        project.setAccountId();
        project.setName();
        project.setTitle();
        project.setContent();
        project.setCreateAt(Date());

        project.save();
Account account = Account();
        account.setId(); //primary key异常
        account.setCreateAt(Date());
        account.setNickName();
        account.setUserName();
        account.setPassword();
        account.setSalt();
        account.setIp(loginIp);
        account.setStatus();
        account.setAvatar();
        account.save();

        renderText();
    }
action不加  @Before(Tx.class)的话,的确会出异常。加了就可以保证。


评论区

JFinal

2018-06-10 16:24

jfinal club 中只对需要的地方添加了事务处理,我个人习惯于使用 Db.tx(...) 来做事务

在项目中搜索一下 Db.tx 就可以搜得到这些地方

此外,如果你要使用 @Before(Tx.class) 来做事务,通常需要添加一个全局拦截器,拦截 @Before(Tx.class) 抛出的异常,然后根据异常的类型来决定 render(...) 到什么地方,或者 renderJson(...) 什么内容

如果你的项目中有很多地方要使用事务,使用 @Before(Tx.class) 再配合一个全局拦截器会比较方便,否则使用 Db.tx 会更方便

JFinal

2018-06-10 16:26

Db.tx 在 Java 8 使用 lambda 表达式会很优雅,代码很省,例如:
Db.tx(() -> {
这个区域是被事务包裹的地方
return true; // 返回true则提交事务,否则回滚事务
});

maxwade

2018-06-10 16:35

@JFinal
那以后,我也借鉴
Db.tx(() -> {
这个区域是被事务包裹的地方
return true; // 返回true则提交事务,否则回滚事务
}这种方式, 毕竟波总最了解如何使用jfinal最优雅。

JFinal

2018-06-10 17:38

@maxwade 关键还是得看应用场景,如果做事务的地方非常多,用 @Before(Tx.class) 配全拦截器会更省代码,类似于放在公网上的互联网项目做事务的地方少用 Db.tx 会很方便

maxwade

2018-06-10 17:53

@JFinal 大多数情况下不容易出现事务异常,所以club中没有采用注解tx.class这种方式?因为club本身也是技术论坛性质的互联网项目。

maxwade

2018-09-01 12:44

@JFinal 今天重新看了这篇文章,发现公司项目里面虽然用了@Before(Tx.class)来保证事务,但没有对事务异常做全局拦截处理,又进一步理解波总之前的解答了。感谢!

热门反馈

扫码入社