Transactions JDO本地事务管理

Transactions JDO本地事务管理,transactions,jdo,Transactions,Jdo,在JDO中,在下面描述的情况下,在执行methodB()之后(从methodA()调用),如果methodA()中发生异常,那么methodA()和methodB()中的代码是否都会回滚,或者仅仅是methodA()中的methodB()commit已经发生。 注意:PersistenceManager是按需创建的,并存储在ThreadLocal中 methodA() { PersistenceManager mgr = getPersistenceManager( ); Tr

在JDO中,在下面描述的情况下,在执行
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()。