一个事务问题,可以的话,希望能大致解释一下Tx.class的代码思路,表示看不太懂

一个事务问题,可以的话,希望能大致解释一下Tx.class的代码思路,表示看不太懂。参考这边的代码http://www.oschina.net/question/2286362_245721

我的代码:

User.java

@Before(Tx.class)
public void updateUsersRole(Object userIds, Object roleId){
  Db.update("update user set role_id = ? where id in("+userIds+")", roleId);
}

UserController.java

public void updRole() {
  String roleId = getPara("roleId");
  String userIds = getPara("userIds");
  if(StrKit.isBlank(userIds) || StrKit.isBlank(roleId)){
    renderJson(Tools.getResult(400));
    return;
  }
  Duang.duang(User.class).updateUsersRole(userIds, roleId);
  renderJson(Tools.getResult(204));
}

有全局action拦截器处理异常

问题:批量update如果有一个没有update成功,并不报异常,也不报错,会继续执行完,那么@Before(Tx.class)是怎么工作的呢?因为不确定它是否真的能正常工作。原本想要做个测试模拟一下,在userIds中携带几个不存在的id,但是修改成功了,没有异常,可能这个模拟比较蠢吧。所以有点慌,真的能工作起来吗?



评论区

JFinal

2016-10-10 15:26

从代码外观上看,是在使用业务层 AOP,所以需要使用 Enhancer.enhance(...) 或者 Duang.duang(...) 先将业务层增强,然后拦截器才会被触发,建议再仔细看一下 jfinal 手册,专门讲了这个问题,控制层的拦截器是自动触发的,与业务层不同

sruz

2016-10-10 17:15

@JFinal 恩,,,,,,,毕竟都有代码示例,,我怎么会漏下呢???Duang.duang(User.class).updateUsersRole(userIds, roleId);,,,,上面那个UserController.java就有哈。关键用我那个比较蠢的模拟,,,没有异常,还是能修改成功的

潇洒太爷

2016-10-11 09:16

@xRhbN 你可以试试直接在业务层throw new RunTimeException

sruz

2016-10-11 11:53

@潇洒太爷 @JFinal 可以,,,问题是这个链接中http://www.oschina.net/question/2286362_245721,波哥回答的那段代码中,并没有做判断手动异常。,,,,,所以 假设他是对的,,,,那种写法不是更加优雅吗? 所以非常想知道TX类的原理(如果是抛异常的话,大致能明白TX类的原理了),,,,,毕竟那些操作不抛异常。不过单纯现在的写法也蛮优雅的了!!!

JFinal

2016-10-11 12:13

@xRhbN 我习惯于在业务层用 Db.tx(...) 来做事务,对动态语言熟悉的开发者会喜欢这种用法

sruz

2016-10-11 12:49

@JFinal 嗯嗯,,唉,,,我真够蠢的,,,就该手册上搜事务关键字,,,,,因为直接目录上,,,只找到个声明式事务,,,,你告诉我Db.tx(之后,,一搜,,还真有,,,,诶,,,醉了,,,,,,,,,,,,相比Tx,我也喜欢这种写法Db.tx(...),,,因为他把异常直接处理掉了,,,赶脚更加爽。

JFinal

2016-10-11 13:04

@xRhbN 手册才 30 多页,而且大部分是代码示例,极其少量的文字,一个小时内能看完,所以一定要仔细看完,节省很多时间,很划算

Db.tx(...) 更好控制,return false 的时候可以控制回滚

sruz

2016-10-11 13:48

@JFinal 嗯嗯,,,到时候试试看奥。。。是的,,不用用抛异常来控制回滚!

热门反馈

扫码入社