NutzCN Logo
问答 Trans.exec是怎么控制事物的??
发布于 2795天前 作者 qq_75eaf26a 2887 次浏览 复制 上一个帖子 下一个帖子
标签:

我试验了一下

Ioc ioc = new NutIoc(new JsonLoader("conf/dao.js"));
		final Dao dao = ioc.get(Dao.class);
		
		Trans.exec(new Atom(){

			@Override
			public void run() {
				Trans.DEBUG = true;
				Role r1 = dao.fetch(Role.class , 1);
				Role r2 = dao.fetch(Role.class , 2);
				int i =1;
				r1.setDescription("管理员测试");
				r2.setDescription("11111111111111");
				dao.update(r1);
				if(i==1){
					try{
						dao.update(r2);
						i=100/0;
					}catch(Exception e){
						e.printStackTrace();
					}
				}
				
			}
			
		});

这个如果在里面捕获异常了,就没办法回滚了,两个update都提交了 如果i=100/0 放在dao.update(r2)上面的话,其中一个事物提交了,这个事物提交的源码我看了下,有点模糊,不知道里面的原理是什么,能请叫兽说说吗。。看不懂。

2 回复

为什么一定要把异常抛出才能控制到事物呢?

因为exec本身就是一个try catch,也是我们觉得比较合理的设计,用户可以明确知道事务开启和结束的位置,同时能确定事务何时才回滚.

exec并不是通过监视用户的run方法运行期间有无产生过异常,而是用try catch捕捉其抛出异常,然后决定回滚.

有人提出过,能不能通过监视用户的run方法内生成过异常然后回滚呢?理论上可以,实际上不能。原因是,没法跟踪所有异常对象的生成,这是java api的限制,没有公开api可以在运行时监听对象生成(类增强和java agent除外),暴力方式是每个异常类都加上跟踪代码。

那,只跟踪特定类型的异常可以吗呢?例如DaoExpection,在其构造方法内添加跟踪代码,一旦产生了DaoExpection,就判定需要回滚。

看上去不错,有异常就回滚呗,但如果用户不想回滚呢?他只是希望执行一个sql测试一下特定的逻辑呢?哦,那我们再加一个机制,允许用户设置为不回滚。恩,完美了吗?并没有-_-||,如果设置为不会滚之后,某个dao操作又抛异常了呢?那到底回滚还是不回滚呢?到最后,用户自己也不知道run方法结束时候,这事务能不能提交,会不会被回滚

说了一堆,我猜你纠结这个是希望手动控制事务,对不? 看看1.r.60新增TxNutDao,它提供完全手动的事务控制,文档也有独立的小节.

添加回复
请先登陆
回到顶部