我有一个@Stateless
-Bean,它在一个方法中执行一些数据库操作
public void doOperation(){
User u1 = createNewUser()
User u2 = createNewUser()
User updated = mergeUser(u1,u2) // just as an example
// should write to database now!
otherBlockingOperation()
}
但是,在阻塞操作完成之前,更改在数据库中不可见,因此在前端中不可见。
我认为这是因为在otherBlockingOperation()
完成之前交易没有提交。然后我将一个otherBlockingOperation()
包裹在一个Thread中,它再次无效。
但是我认为真正的问题是merge
,它只会在方法完成后更新实体。如何立即更改Object的值?
编辑:
@PersistanceContext
private EntityManager em;
mergeUser(T entity){
em.merge(entity);
em.flush();
}
根据实际业务需求,可能的解决方案是将otherBlockingOperation()
方法移动到新的@Stateless
bean并将该方法标记为@Asynchronous @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
。这将有效地在新线程和新事务中运行该方法。你只需要@Inject
新的bean并调用otherBlockingOperation()
方法。
新事务可能(或可能不)是有效选项,具体取决于业务需求(即新事务可能会失败,而原始事务可能会成功)。但是,更新将在DB中提交(但仍然在提交原始事务之后),而不依赖于otherBlockingOperation()
进程(甚至成功提交)。