1

这是我的第一篇文章,并且偶尔会访问任何与 Java 相关的问题。这是一个非常有用的网站,老年人非常乐于帮助他人。

环境:Oracle、Jboss、EJB 2、休眠、MDB、MQ、CMP

我们的应用程序每天随机面临一次/两次死锁问题,所以我打开了休眠跟踪。请是高级代码

@Stateless
public class SaveData() {

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
methodA(){

    Method B();
    em.persist(obj1);

    Method C();
    Method D();

    em.flush();
}

methodB(){

}

methodC(){

  em.persist(obj2);
}

methodD(){
  em.persist(obj3);
}

} // bean结束

由于这个问题只发生在生产中,没有其他地方发生,我无法重新创建它。因此,我将添加 TransactionAttributeType.REQUIRES_NEW 以将其保留在同一事务中,现在以下是我的问题:

  1. 事务的开始是 MethodB() 和结束是 MethodD() 还是会有任何内部新事务?

  2. 如何检查事务 ID 或日志消息以了解事务的开始和结束,以确保一切都在一个事务中发生?

谢谢你的帮助。

4

1 回答 1

0
  1. 事务的开始是 MethodB() 和结束是 MethodD() 还是会有任何内部新事务?不,事务从 A 开始,也从 A 结束,因为它在内部调用其他方法。此外,您还没有明确指定任何事务属性,因此默认值为Required. 因此,同一事务将通过其他方法传播。

  2. How do I check the transaction id or log message for start & end of the transaction to make sure everything is happening in one transaction?. In case of CMT not sure how to verify that, but if you want to monitor & manage it explicitly, you can have BMT. Then you will be able to start & end transaction manually.

于 2012-05-11T08:13:38.503 回答