我有一个@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()
包装在一个线程中,但它不再起作用。
但是我认为真正的问题是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()
方法即可。
新事务可能(或可能不是)是有效选项,具体取决于业务需求(即新事务可能会失败,而原始事务可能会成功)。但是,更新将更快地在数据库中提交(但仍在提交原始事务之后),而不依赖于 otherBlockingOperation()
进程(甚至成功提交)。
关于java - 在方法完成之前未写入数据库的 JPA 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55302110/