2013-05-10 2 views
0

В 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(); 
    } 

}

ответ

0

Сделки не вложен, они независимы. ТЧ различны, поэтому txns различны. Один не может она катится назад, и не имеет ничего общего с другой

+0

Понял ... это означает, что если мы будем использовать тот же ПМ, то оба метода бы откатить. – Jude

+0

, если вы использовали один и тот же PM, тогда у вас есть только одна транзакция (в соответствии с тем, что вы увидели бы, прочитав спецификацию JDO), и у вас возникло бы исключение, когда вы вызвали tx.begin() в транзакции, которая уже была запущена (так что вы, очевидно, никогда не пробовали это) – DataNucleus

+0

Я еще не пробовал этого, однако пытался выяснить, как структурировать код, чтобы при транзакционном методе B вызывается из другого транзакционного метода. Оба метода относятся к одной и той же транзакции и когда методB вызывается независимо, тогда он все равно может быть транзакционным. – Jude

0

Methoda и methodB является частью две разных транзакции т.е. не атомная причиной транзакции: -

1> с использованием одного экземпляра ПМ для двух различных сделок также Безразлично 't гарантировать, что две разные транзакции используют один и тот же идентификатор экземпляра транзакции всегда из-за отсутствия гарантии того, что объект вложенного объекта метода B будет сохраняться всегда в состоянии «persistance-clean» (побочные эффекты сохраняющегося объекта в грязном состоянии) и Метод B транзакция не распространяется на метод A, как и раньше, она начинает совершать транзакции, а затем снова переходит в A.

2>сделка не является контекстуальной и, следовательно, транзакция никогда не будет совершена для всей сессии или последовательности методов.

3> Как указано из весеннего шаблона, для конкретной транзакции только один раз, когда экземпляр транзакции всегда извлекается, и целая вся транзакция завершена, тогда только она совершена, ([это косвенно упоминается в документе jdo косвенно: [1 ]: http://www.datanucleus.org/products/accessplatform_4_1/jdo/transactions.html#spring). Одним из возможных способов было бы то, что метод A должен действовать как субъект или наблюдатель для транзакции здесь, а метод B должен быть подписчиком, и когда весь абонент уведомляется об определенной транзакции, транзакция должна быть совершена.

Для более см: Patterns for propagating changes to nested objects

Смежные вопросы