在方法完成之前未写入的DB上的JPA更改

问题描述 投票:2回答:1

我有一个@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();
}
java jpa java-ee java-ee-7
1个回答
4
投票

根据实际业务需求,可能的解决方案是将otherBlockingOperation()方法移动到新的@Stateless bean并将该方法标记为@Asynchronous @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)。这将有效地在新线程和新事务中运行该方法。你只需要@Inject新的bean并调用otherBlockingOperation()方法。

新事务可能(或可能不)是有效选项,具体取决于业务需求(即新事务可能会失败,而原始事务可能会成功)。但是,更新将在DB中提交(但仍然在提交原始事务之后),而不依赖于otherBlockingOperation()进程(甚至成功提交)。

© www.soinside.com 2019 - 2024. All rights reserved.