下面是我正在尝试做的一个例子:
@Stateless(name = "TestBean", mappedName = "TestBean")
@Local
public class TestBean
{
@Resource
SessionContext ctx;
@EJB
TestBean2 testBean2;
public TestBean()
{
}
public void doSomething()
{
testBean2.methodA();
boolean isSuccess = testBean2.methodB();
if(!isSuccess)
ctx.setRollbackOnly();
}
}
'TestBean2'的配置与'TestBean'相同。
上面的问题是,当testBean2中的methodB失败时,methodA中完成的更改不会被回滚/恢复。方法A中完成的更改是通过EntityManager中的persist方法完成的。
现在,我知道我没有指定任何事务属性,但我已经读过默认事务属性通常是必需的。
最后一点,我知道有很多线程与这些问题有关但我一直在想它们并且有很多它们。所以如果有一个类似于上述情况的线程那么我会很感激如果你引导我的话。
由于
更新:
在methodA中,我在执行持久化(使用EntityManager)后发出了一个flush语句。删除flush语句后,回滚按预期工作。我的数据源配置全部在weblogic服务器上完成,其中选中了“支持全局事务”标志。
显然,flush方法不应该发出commit语句。那为什么它真的要承诺呢?