在下面的设置中,方法B是否在(新的)事务中运行?
一个EJB,有两个方法,方法A和方法B
public class MyEJB implements SessionBean
public void methodA() {
doImportantStuff();
methodB();
doMoreImportantStuff();
}
public void methodB() {
doDatabaseThing();
}
}EJB是容器托管的,在requires_new事务中使用methodB,而在required事务中使用方法A。因此:
<container-transaction id="MethodTransaction_1178709616940">
<method id="MethodElement_1178709616955">
<ejb-name>MyName</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</method>
<method id="MethodElement_1178709616971">
<ejb-name>MyName</ejb-name>
<method-name>methodB</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>现在让另一个EJB通过EJB方法调用来调用methodA。methodA现在在事务中运行。从methodA对methodB的后续调用是在同一事务中运行,还是在新事务中运行?(注意,这里是实际的代码。没有对方法B的显式ejb调用)
发布于 2009-01-09 10:09:52
您对EJB的调用是一个普通的方法调用,不会被methodB()容器拦截;在运行时,EJB容器将注入一个proxy,而不是您的类的实例,这是它在调用您的方法之前拦截调用和设置环境的方式。如果您使用this,您将直接调用一个方法,而不是通过代理。因此,无论ejb-jar.xml中为通过EJB接口调用定义了什么,这两种方法都将使用相同的事务。
发布于 2012-09-08 20:11:39
注入SessionContext,并向它请求您的代理实例:
@Stateless
public class UserFacade implements UserFacadeLocal {
@Resource
private SessionContext context;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void create(User user) {
System.out.println("Users Count: "+count()); //invocation#1
System.out.println("Users Count Through Context: "+context.getBusinessObject(UserFacadeLocal.class).count()); //invocation#2
}
@Override
@TransactionAttribute(TransactionAttributeType.NEVER)
public int count() {
return ((Long) q.getSingleResult()).intValue();
}
}在“invocation#1”中,这是一个本地调用,不通过proxy传递,它将返回计数
在'invocation#2‘中,这是一个通过代理的调用,因此您将其注释为不支持transaction -which现在由create(user)方法打开-,此调用将抛出事务异常:
javax.ejb.EJBException:无法在全局事务中调用EJB
发布于 2009-01-09 09:22:03
它们将使用相同的事务。
如果我没记错的话,事务是在方法被调用之前由容器启动的,并在它“完成”之后提交。
因为"a“调用"b",所以"b”将使用相同的事务。
:S
我想你能做的最好的事情就是测试它来验证它!:)
https://stackoverflow.com/questions/427452
复制相似问题