В JDO в ситуации, описанной ниже, после выполнения методаB() (который был вызван методом methodA()), если в методе метода A() возникает исключение, будет выполняться откат для кода как в methodA() и methodB() или только метод A(), как в методе метода 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();
}
}
Понял ... это означает, что если мы будем использовать тот же ПМ, то оба метода бы откатить. – Jude
, если вы использовали один и тот же PM, тогда у вас есть только одна транзакция (в соответствии с тем, что вы увидели бы, прочитав спецификацию JDO), и у вас возникло бы исключение, когда вы вызвали tx.begin() в транзакции, которая уже была запущена (так что вы, очевидно, никогда не пробовали это) – DataNucleus
Я еще не пробовал этого, однако пытался выяснить, как структурировать код, чтобы при транзакционном методе B вызывается из другого транзакционного метода. Оба метода относятся к одной и той же транзакции и когда методB вызывается независимо, тогда он все равно может быть транзакционным. – Jude