JDO本地事务管理

时间:2013-05-10 02:09:50

标签: transactions jdo

在JDO中,在下面描述的情况下,执行methodB()之后(已从methodA()调用),如果在methodA()中发生异常,则会对代码进行回滚methodA()methodB()中的methodA()methodB()中的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( ); } } 提交已经发生。 注意:PersistenceManager是按需创建的,并存储在ThreadLocal

{{1}}

2 个答案:

答案 0 :(得分:0)

交易不是嵌套的,它们是独立的。 PM是不同的,因此txns是不同的。一个人没有回滚,与另一个无关

答案 1 :(得分:0)

方法A和方法B是第二部分不同的事务,即非原子事务原因: -

1>对两个不同的事务使用相同的PM实例也不能确保两个不同的事务使用相同的事务实例id总是因为不能保证嵌套的方法B对象要保持在'persistance-clean&#39 ;状态总是(持久对象在脏状态下的副作用)和 方法B事务没有像以前那样传播到方法A,它在被提交之后再被提交到A。

2 - ; 事务不是上下文,因此永远不会为整个会话或方法序列提交事务。

3>从spring模板引用,对于特定事务,只有在事务实例总是被检索并且整个事务完成后才会被提交,([它也间接地在jdo文档中间接提到:   [1]:http://www.datanucleus.org/products/accessplatform_4_1/jdo/transactions.html#spring)。一种可能的方法是,方法A应当作为交易的主体或观察者,方法B应该是订户,当所有订户都被告知特定交易时,应该提交交易。

有关详情,请参阅:Patterns for propagating changes to nested objects