我有以下情况:(伪代码)
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...
}
==> 会发生以下情况:
[1] 只有在 SessionBean2.method2() 中的事务完成后才能达到!(尽管 SessionBean1.method1() 中的最后一条语句是在此之前到达的。)
就好像 SessionBean1.method1() 的事务以某种方式没有“释放”(因为需要一个更好的词 - 它确实在事件处理程序 ObserverObject.method2() 被调用之前立即提交!)直到异步调用Session2.method2() 的事务也完成了。
有谁知道我怎么能避免这种情况?
(整个设置的重点是SessionBean2.method2()
在 T1 完成后在后台进行长时间运行并SessionBean1.method1()
尽快返回。)
PS:我已经验证过了
a) T1 立即提交(记录进入数据库)
b) SessionBean2.method2() 被异步调用(控制立即跳转到调用代码中的下一条语句)
c) SessionBean1.method1() 在 T2 完成之前不会将控制权返回给调用者代码