Transactions Ejb CMT事务属性NotSupported不挂起客户端事务

Transactions Ejb CMT事务属性NotSupported不挂起客户端事务,transactions,locking,ejb,deadlock,Transactions,Locking,Ejb,Deadlock,我们在EJB3.0/JPA1.0/DB210.1应用程序中遇到了表锁定和死锁问题。我们发现,如果在支持事务的ejb方法中执行简单的SELECT查询,记录就会被锁定(next key share lock-NS lock模式),这最终会导致死锁的潜在问题。如果在ejb方法中执行相同的查询而没有事务,则不会发生锁定,我认为这是应该的方式 问题:我们有EJBEJBA和methodA,需要事务。我们有带有methodB的ejbB,它有简单的选择查询,不应该在事务中运行,所以我们将trnaAction属性

我们在EJB3.0/JPA1.0/DB210.1应用程序中遇到了表锁定和死锁问题。我们发现,如果在支持事务的ejb方法中执行简单的SELECT查询,记录就会被锁定(next key share lock-NS lock模式),这最终会导致死锁的潜在问题。如果在ejb方法中执行相同的查询而没有事务,则不会发生锁定,我认为这是应该的方式

问题:我们有EJBEJBA和methodA,需要事务。我们有带有methodB的ejbB,它有简单的选择查询,不应该在事务中运行,所以我们将trnaAction属性设置为:NotSupported。我们把methodA称为methodB

OracleEE6教程说:如果客户机在事务中运行并调用企业bean的方法,那么容器将在调用该方法之前暂停客户机的事务。方法完成后,容器恢复客户端的事务

正如我们所理解的,methodB应该暂停methodA的事务,并且不应该锁定记录,但它确实锁定了记录,这让我得出结论,事务没有暂停


您能帮助我们解决和理解这种行为吗。

您如何称呼
methodB

如果调用代码如下所示:

@无状态
公共类{
@TransactionAttribute(必需)
公共无效方法A(){
...
方法b();
...
}
@TransactionAttribute(不受支持)
公共无效方法B(){
...
}
}
应用服务器永远不会知道何时暂停事务(方法调用不会调用容器创建的代理的方法)

要正确调用具有不同事务语义的方法,您需要访问
SessionContext
上可用的增强对象,如下所示:

@无状态
公共类{
@资源
SessionContext sc;
我的自我;
@施工后
公共void init(){
this.self=this.sc.getBusinessObject(MyEJB.class);
}
@TransactionAttribute(必需)
公共无效方法A(){
...
self.methodB();
...
}
@TransactionAttribute(不受支持)
公共无效方法B(){
...
}
}

谢谢您的回答。我们从ejbA.methodA中调用ejbB.methodB,这是不同的ejb,所以这应该不是问题所在。你能更新你的问题吗?