有两个类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();
}