gpt4 book ai didi

java - 具有容器管理事务的单例 EJB 并发

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:45 26 4
gpt4 key购买 nike

我有一个 Singleton-EJB,它从具有特定状态的数据库中读取所有对象。然后我对这些对象做一些事情并将状态设置为其他东西:

@Singleton
public class MyEJB {

@PersistenceContext(unitName = "MyPu")
private EntityManager em;

@Lock(LockType.WRITE)
public void doSomeStuffAndClose() {
List<MyObj> objects = getAllOpenObjects();
for (MyObj obj : objects) {
// do some stuff here...
obj.setClosed(true);
}
}

private List<MyObj> getAllOpenObjects() {
TypedQuery<MyObj> q = em.createQuery("select o from MyObj o "
+ "where o.closed = false", MyObj.class);
return q.getResultList();
}
}

现在,如果我想确保不能同时调用我的方法,我添加注释 @Lock(LockType.WRITE)。但是在数据库中设置状态的事务在锁被释放后提交,下一个调用者有可能再次获取相同的对象。

我怎样才能避免这种情况?

最佳答案

如果您使用的是 Wildfly:这是一个错误。 https://issues.jboss.org/browse/WFLY-4844描述了将在 Wildfly 10 中修复的问题。该问题被描述为计时器问题,可能与您的问题相同。

我的解决方法是将完成工作的代码分离到另一个由外部(计时器)bean 调用的 bean 中。外部 bean 方法被注释为不启动事务 (@TransactionAttribute(TransactionAttributeType.NEVER)),因此事务在第二个新 bean 中启动并安全完成。

关于java - 具有容器管理事务的单例 EJB 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19113612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com