我有以下情况:( pesudo-code)
CallerObject.method() {
SessionBean1.method1(); // through remote bean interface
// [1]
}
@TransactionAttribute(REQUIRED)
SessionBean1.method1() {
// do something...
Event<myClass>.fire();
// do something...
}
ObserverObject.method2(@Observes(during=AFTER_SUCCESS) myClass) {
sessionBean2.method2(); // through local bean interface
}
@Asynchronous
@TransactionAttribute(REQUIRED)
SessionBean2.method2() {
// do something...
}
==&GT;发生以下情况:
只有在SessionBean2.method2()中的事务完成后才会到达[1]! (尽管在此之前已达到SessionBean1.method1()中的最后一个语句。)
就好像SessionBean1.method1()的事务不是“释放”了(因为想要一个更好的词 - 它会在调用事件处理程序ObserverObject.method2()之前立即提交!)直到异步调用 Session2.method2()的事务也完成了。
有谁知道我怎么能避免这种情况?
(整个设置的目的是在T1完成后在后台运行长时间SessionBean2.method2()
,并尽快返回SessionBean1.method1()
。)
P.S。:我已经验证了
a)T1立即提交(记录进入数据库)
b)异步调用SessionBean2.method2()(控件立即跳转到调用代码中的下一个语句)
c)在T2完成之前,SessionBean1.method1()不会将控制权返回给调用者代码