容器管理持久性(EJB2.1)中的Oracle死锁问题

时间:2012-05-11 01:15:41

标签: hibernate ejb deadlock

这是我的第一篇文章&偶尔访问任何类型的Java相关问题。这是一个非常有用的网站,老年人非常善于帮助他人。

环境:Oracle,Jboss,EJB 2,hibernate,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 end

因为这个问题只发生在生产和生产中。没有别的地方,我无法再创造它。所以我将添加TransactionAttributeType.REQUIRES_NEW以使其保持在同一个事务中,现在我的问题如下:

  1. 交易的开始是MethodB()&结尾是MethodD()还是会有任何内部新事务?

  2. 如何检查交易ID或日志消息以便启动&交易结束以确保一次交易中发生的一切事情?

  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

  2. 如何检查交易ID或日志消息以便启动&交易结束,以确保一次交易中发生的一切? 如果CMT不确定如何验证,但是如果您想要监控&明确地管理它,你可以拥有BMT。然后你就可以开始&手动结束交易。