声明式Aop事务

Jul 10, 2017 10:38:44 AM

作者:wendal

简介

声明式事务, 可以脱离Trans类实现单个方法或多个的事务模板. 例如设置Service类所有insert开头的方法,均应用READ_COMMITTED事务

声明式事务,是通过aop拦截器做的, 而aop依赖ioc, 在@IocBy注解中启用即可.

  1. @IocBy(type=ComboIocProvider.class,
  2. args={"*json","org/nutz/mvc/testapp/classes/ioc",
  3. "*anno","org.nutz.mvc.testapp.classes",
  4. "*tx" // 你只需要加上这一行,即可声明5种不同事务级别的拦截器.
  5. })
  6. public class MainModule {}

基于注解的声明式事务

为单个方法添加事务. 必须是Ioc Bean(注解/或json声明的bean都可以), 而且不可以是工厂方法生成的对象哦

  1. // 演示aop事务
  2. @IocBean // 需要aop,那当然需要时ioc的bean
  3. public class UserService {
  4. @Inject Dao dao; // 注入NutDao实例,必须的,哈哈
  5. @Aop(TransAop.READ_COMMITTED) // TransAop里面定义5个常量,分别对应不同级别的事务拦截器
  6. public void add(User user) {
  7. dao.insert(user);
  8. dao.update(UserToken.class, Chain.make("xxx","xxx"), Cnd.where(.......);
  9. // 务必注意,必须抛出异常,才能回滚!! 是抛出,不能被catch吃掉.
  10. }
  11. }

基于json的声明式事务

这种方式也是aop,通过JsonAopConfigration实现的,可以按"正则表达式"匹配需要类名和方法名称, 应用特定的事务拦截器

  1. var ioc = {
  2. $aop : {
  3. type : "org.nutz.ioc.aop.config.impl.JsonAopConfigration",
  4. fields : {
  5. itemList : [
  6. //[类名的正则表达式,方法名的正则表达式,事务拦截器名称] 事务拦截器的名称请看TransAop类
  7. ["net.wendal.nutzcn.servie..+Service$", "^save.+", "txREAD_COMMITTED"],
  8. ["net.wendal.nutzcn.servie..+Service$", "^query.+", "txNONE"],
  9. ["net.wendal.nutzcn.servie..+Service$", "^update.+", "txSERIALIZABLE"],
  10. ["net.wendal.nutzcn.module..+Module$", ".+", "txREAD_COMMITTED"],
  11. ]
  12. }
  13. }
  14. }

如果上述规则不能满足你的需求,可继承JsonAopConfigration,覆盖setItemList方法实现自定义哦.

当然, 更进一步,你可以继承AbstractAopConfigration甚至直接实现AopConfigration接口哦

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/aop/aop_trans.html