在下面描述的情况中的JDO中,在methodB()被执行(已从methodA()中调用)之后,如果methodA()中发生异常,代码的回滚将发生在methodA()和methodB()或者methodA()中的方法B()提交已经发生。 注:PersistenceManager的是按需创建并存储在ThreadLocal的JDO本地事务管理
methodA(){
PersistenceManager mgr = getPersistenceManager();
Transaction trans;
trans = mgr.currentTransaction();
try {
trans.begin();
methodB();
//some delete/update code
// An exception occurs
trans.commit();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(trans.isActive()) {
trans.rollback();
}
mgr.close();
}
}
的methodB(){
PersistenceManager mgr = getPersistenceManager();
Transaction trans;
trans = mgr.currentTransaction();
try {
trans.begin();
//code
trans.commit();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(trans.isActive()) {
trans.rollback();
}
mgr.close();
}
}
明白了...这意味着如果我们用同样的PM那么这两个方法就会回滚。 – Jude 2013-05-12 05:38:10
如果您使用过相同的PM,那么您只有一个事务(按照您通过阅读JDO规范所看到的内容),并且您在已经启动的事务上调用tx.begin()时会发生异常(所以你显然从来没有尝试过) – DataNucleus 2013-05-12 06:56:57
我还没有尝试过,但是试图弄清楚如何构造代码,以便当从另一个事务方法调用事务方法B时,这两种方法都属于同一事务,并且当方法B即使这样,它仍然是事务性的。 – Jude 2013-05-12 11:23:31