日期:2014-05-18  浏览次数:20881 次

transaction begin,commit, rollback的问题
有两个类A和B,B是已经实现好的,现在的逻辑是这样的
Java code

A.method1(){
  beginTransaction();
  try{
      //business
      B.business();
      commitTransaction();
  }catch(Exception e){
   rollback();
  }
}


结果发现B.business()里面也有类似的逻辑(beginTransaction,commitTransaction)
这样上面的代码就有错误,因为逻辑上就变为
begin
  begin
  commit
commit

把代码改为
Java code

A.method1(){
  beginTransaction();
  try{
      //business
      commitTransaction();

      B.business();//放到commit下面
  }catch(Exception e){
   rollback();
  }
}


编译上是没有问题,但是在catch里面,rollback的时候是rollback了哪个transaction呢?能保证出错后A和B所作的操作都rollback吗?

------解决方案--------------------
到群里来吧!你这问题不好解决,

建议你干脆就不要使用外面的事务了,比如
A.method1(){
 B.business();
}

这样不就行了,你何必再自己封装一个呢!?

------解决方案--------------------
因为事务不能直接嵌套

如果在catch里回滚的话,应该是回滚try块里的

如果想A和B同时回滚的话用一个事务套住A和B的操作,应该可以o(∩_∩)o...


------解决方案--------------------
事务嵌套了吧

里面事务不依赖于外面的 就不会rollback
------解决方案--------------------
个人觉得那个transaction有异常就rollback那个transaction.

=================================

哇这里的人除了星星,就是星星的马甲
------解决方案--------------------
SomeManager.business(){
try{
A.method(){...}//这里有自己的begin, commit, 没有rollback
}catch(Exception e){
rollback();
throw e; //A出错,B就不会被执行到
}


B.method(){...}//有rollback
}
还是有问题
如果B有错误回滚了,但是A的操作已经commit了
------解决方案--------------------
如果A.method1除了调用B.business方法外,再没有其他的业务逻辑,干脆不使用外面的事务

就这样
A.method1(){ 
B.business();