声明式Aop事务
By:wendal<wendal1985@gmail.com>

简介

Top

声明式事务, 可以脱离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都可以), 而且不可以是工厂方法生成的对象哦

Top
// 演示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实现的,可以按"正则表达式"匹配需要类名和方法名称, 应用特定的事务拦截器

Top
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接口哦