Transactions JDO本地事务管理
在JDO中,在下面描述的情况下,在执行Transactions JDO本地事务管理,transactions,jdo,Transactions,Jdo,在JDO中,在下面描述的情况下,在执行methodB()之后(从methodA()调用),如果methodA()中发生异常,那么methodA()和methodB()中的代码是否都会回滚,或者仅仅是methodA()中的methodB()commit已经发生。 注意:PersistenceManager是按需创建的,并存储在ThreadLocal中 methodA() { PersistenceManager mgr = getPersistenceManager( ); Tr
methodB()
之后(从methodA()
调用),如果methodA()
中发生异常,那么methodA()
和methodB()
中的代码是否都会回滚,或者仅仅是methodA()
中的methodB()
commit已经发生。
注意:PersistenceManager是按需创建的,并存储在ThreadLocal中
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( );
}
}
事务不是嵌套的,它们是独立的。PMs不同,因此TXN也不同。一个失败,它回滚,与另一个无关方法A和方法B是不同事务的第二部分,即非原子事务原因:- 1> 为两个不同的事务使用相同的PM实例也不能确保两个不同的事务始终使用相同的事务实例id,因为无法保证要持久化的嵌套方法B对象始终处于“持久化清理”状态(持久化对象处于脏态的副作用)和 方法B事务不像以前那样被传播到方法A,它在被提交之前,然后再次被传播到方法A 2> 事务不是上下文的,因此,不会为整个会话或方法序列提交事务 3> 正如spring模板所引用的,对于特定事务,只有在始终检索事务实例并完成整个事务之后,才会提交整个事务,([在jdo文档中也间接提到: [1] :)。一种可能的方法是,方法A应充当此处交易的主体或观察者,方法B应为订户,当所有订户都收到针对特定交易的通知时,则应提交该交易
有关更多信息,请参阅:明白了……这意味着如果我们使用相同的PM,那么这两种方法都会回滚。如果您使用相同的PM,那么您只有一个事务(根据您阅读JDO规范所看到的情况),并且当您对已启动的事务调用tx.begin()时,会出现异常(所以你显然从未尝试过这个)我还没有尝试过这一点,但是我正在试图弄清楚如何构造代码,以便当从另一个事务性方法a调用事务性方法B时,两个方法都属于同一个事务,并且当独立调用方法B时,它仍然可以是事务性的。显然,在调用tx.begin()之前在每个方法中,我都应该在调用tx.begin()之前检查tx.isActive()。