关于JFinal事务回滚及Service层事务回滚问题

luke0202 发布于 2016/02/03 12:02
阅读 3K+
收藏 2

Linux基金会免费官方培训及考试申请即将截止,戳这里申请!>>>

@JFinal 波总,今天用最新版2.2写了一段事务回滚的代码,结果事务没有进行回滚,关于JFinal的事务回滚,虽然看了文档,但是一直有种模糊的感觉。以下是我的测试代码(我的两个表都是InnoDB引擎):

Controller:

public class TestController extends Controller {

	public void index(){
		BlogService blogService = Duang.duang(BlogService.class,Tx.class);
		boolean isSuc = blogService.save("1");
		renderText("Test:"+isSuc);
	}
}



Service:

public class BlogService {

	@Before(Tx.class)
	public boolean save(){
		boolean succeed = Db.tx(new IAtom(){
			public boolean run() throws SQLException {
				Test test = new Test();
				Blog blog = new Blog();
				test.set("test", "测试事务");
				blog.set("blogtitle", "测试事务标题一定要长测试事务标题一定要长测试事务标题一定要长测试事务标题一定要长").set("blogtime", "2016-05-05");
				boolean testSuc = test.save();
				boolean blogSuc = blog.save();
				return testSuc && blogSuc;
			}
		});
		return succeed;
	}
	@Before(Tx.class)
	public boolean save(String param){
		try{
			Test test = new Test();
			Blog blog = new Blog();
			test.set("test", "测试事务");
			blog.set("blogtitle", "测试事务标题一定要长测试事务标题一定要长测试事务标题一定要长测试事务标题一定要长").set("blogtime", "2016-05-05");
			boolean testSuc = test.save();
			boolean blogSuc = blog.save();
			return testSuc && blogSuc;
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
}



其中调用Service无参save()方法,无论在哪一层,事务都可以回滚,但是有参save(String param)方法事务不能回滚。请各位帮忙分析一下。

加载中
2
JFinal
JFinal

  带有参数的 save() 方法使用了 try catch,在发生异常时,并没能向上抛出,而拦截器 Tx 是在捕获到异常后才回滚事务的,这里的 return false 实际上对 Tx 拦截器回滚是没有作用的。

   不带参数的 save() 方法使用的是 Db.tx(...) 做的事务,这个方法是利用的 return false 或者异常来回滚事务的。

  上面的代码第一个save() 是三层嵌套的事务:Duang.duang这里一层,@Before(Tx.class)这里一层,Db.tx(...) 这里一层,完全有必要弄成三层,但愿在这里只是个测试。

   上面的代码的第二个save()是两层嵌套事务,建议仔细看一下 jfinal 手册中的 AOP 部分

Jimmy哥
Jimmy哥
"完全有必要弄成三层,但愿在这里只是个测试" 应该是"完全没有必要..."吧
1
iehyou
iehyou
第二个当然是不会回滚  你都try,catch异常,就表示 对于事务来说内部代码忽略这个异常,等于没有异常,没有异常当然不会滚 这个是基础,不是jfinal的问题
iehyou
iehyou
回复 @IceRainYWC : 一般是需要有一个全局拦截器,拦截所有异常。
luke0202
luke0202
如果我不进行try catch,那save(String param)方法报错,页面进入500错误页面,这种情况怎么处理呢?事务回滚之后肯定也是要有友好提示啊。
0
iehyou
iehyou
还是 @jfinal 回答专业。 第一个是嵌套了2个事务方法
返回顶部
顶部