声明式Aop事务

优质
小牛编辑
131浏览
2023-12-01

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

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

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

基于注解的声明式事务

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

// 演示aop事务
@IocBean // 需要aop,那当然需要时ioc的bean
public class UserService {
    @Inject Dao dao; // 注入NutDao实例,必须的,哈哈

    @Aop(TransAop.READ_COMMITTED) // TransAop里面定义5个常量,分别对应不同级别的事务拦截器
    public void add(User user) {
        dao.insert(user);
        dao.update(UserToken.class, Chain.make("xxx","xxx"), Cnd.where(.......);
        // 务必注意,必须抛出异常,才能回滚!! 是抛出,不能被catch吃掉.
    }
}    

基于json的声明式事务

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

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

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

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