声明式Aop事务
优质
小牛编辑
137浏览
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接口哦