在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}}
答案 0 :(得分:0)
交易不是嵌套的,它们是独立的。 PM是不同的,因此txns是不同的。一个人没有回滚,与另一个无关
答案 1 :(得分:0)
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应该是订户,当所有订户都被告知特定交易时,应该提交交易。