作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了负责启动事务的 EJB 组件的问题。
我正在使用 Jboss 5.01。
基本上我想在提交特定事务后执行给定的代码。特定代码还涉及调用一个 EJB 组件,该组件使其成为自己的事务。
为了确保我的代码在前一个事务提交后执行,我注册了一个
同步组件变成事务组件:
Transaction tx = transactionManager.getTransaction();
tx.registerSynchronization(new CallbackSynchronization());
Synchronizaton
实现基本上执行以下操作:
class CallbackSynchronization implements Synchnronization {
private AccountService service; // This is a Stateless session bean
public CallbackSynchronization(AccountService service) {
this.service = service;
}
public afterCompletion(int status) {
if(Status.STATUS_COMMITTED == status) {
service.deleteAccounts();
}
}
}
service.deleteAccounts()
我得到一个异常,最终告诉我事务不活跃。
@TransactionAttribute(TransactionAttributeType.REQUIRED)
标记的方法的 EJB如果一个事务不活动,将创建一个新事务(REQUIRED 是 JBOSS 中的默认值)。
最佳答案
问题是您启动的原始事务仍然与线程相关联(即使它处于 COMMITTED 状态)。使用 Transaction 之间的显着差异之一和 TransactionManager是后者的commit()和 rollback()方法将取消事务与线程的关联。从 javadoc 中引用这两种方法:
When this method completes, the thread is no longer associated with a transaction.
public afterCompletion(int status) {
if(Status.STATUS_COMMITTED == status) {
try { transactionManager.rollback(); } catch (Throwable t) {}
service.deleteAccounts();
}
}
public afterCompletion(int status) {
if(Status.STATUS_COMMITTED == status) {
try {
transactionManager.begin();
service.deleteAccounts();
transactionManager.commit();
} catch (Exception e) {
// ... handle exception here
}
}
}
关于java - 事务不活动异常 - EJB 事务状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069518/
我是一名优秀的程序员,十分优秀!