【问题标题】:JDO Local Transaction ManagementJDO 本地事务管理
【发布时间】:2013-05-10 02:09:49
【问题描述】:

在下面描述的JDO中,在methodB()被执行之后(已经从methodA()调用),如果methodA()发生异常,那么methodA()methodA()中的代码都会发生回滚。 methodB() 或只是 methodA() 如在 methodB() 提交已经发生。 注意: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(  );
    }
}

【问题讨论】:

    标签: transactions jdo


    【解决方案1】:

    事务不是嵌套的,它们是独立的。 PM不同,因此txns不同。一个失败就回滚,和另一个无关

    【讨论】:

    • 知道了...这意味着如果我们使用相同的 PM,那么这两种方法都会回滚。
    • 如果您使用了相同的 PM,那么您只有一个事务(根据您通过阅读 JDO 规范所看到的),并且当您调用 tx.begin() 时会出现异常在已经开始的交易上(所以你显然从未尝试过)
    • 我还没有尝试过,但是试图弄清楚如何构造代码,以便当从另一个事务方法 A 调用事务方法 B 时,两个方法都属于同一个事务,并且当方法 B 是即使这样,它仍然可以独立调用。
    • 显然在每个方法中调用 tx.begin() 之前,我应该在调用 tx.begin() 之前检查 tx.isActive()。
    【解决方案2】:

    methodA 和 methodB 是两个不同的事务,即非原子事务原因:-

    1> 对两个不同的事务使用相同的 PM 实例也不能确保两个不同的事务总是使用相同的事务实例 id,因为不能保证要持久化的嵌套方法 B 对象处于“持久清洁”状态总是(将对象持久化为脏状态的副作用)和 方法 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2022-09-27
      • 2016-12-02
      • 2011-08-08
      • 2010-11-29
      相关资源
      最近更新 更多