Database 交易在什么时候提交?

Database 交易在什么时候提交?,database,jakarta-ee,jpa,ejb,entity,Database,Jakarta Ee,Jpa,Ejb,Entity,我读过,看过一些关于这方面的视频,但我仍然不确定我是否理解。我知道在底层的RDBMS中也有一种锁定机制(我使用的是mysql) 我想知道在什么时候提交事务/分离实体,以及从锁定的角度看它如何影响其他事务。用户必须在什么时候等待事务完成?我在下面做了两个不同的场景。为了理解,我断言场景中的表包含很多行,而For循环需要10分钟才能完成 场景1: @Stateless public class AService implements AServiceInterface { @Persiste

我读过,看过一些关于这方面的视频,但我仍然不确定我是否理解。我知道在底层的RDBMS中也有一种锁定机制(我使用的是mysql)

我想知道在什么时候提交事务/分离实体,以及从锁定的角度看它如何影响其他事务。用户必须在什么时候等待事务完成?我在下面做了两个不同的场景。为了理解,我断言场景中的表包含很多行,而
For
循环需要10分钟才能完成

场景1:

@Stateless
public class AService implements AServiceInterface {
    @PersistenceContext(unitName = "my-pu")
    private EntityManager em;
    @Override
    public List<Aclass> getAll() {
        Query query = em.createQuery(SELECT_ALL_ROWS);
        return query.getResultList();
    }
    public void update(Aclass a) {
        em.merge(a);     
    }
}
@Stateless
public class AService implements AServiceInterface {
    @PersistenceContext(unitName = "my-pu")
    private EntityManager em;

    @Override
    public List<Aclass> getAllAndUpdate() {
        Query query = em.createQuery(SELECT_ALL_ROWS);
        List<Aclass> listAclass = query.getResultList();
        for(Aclass a : listAclass ){
           a.setProperty(methodThatTakesTime());
           em.merge(a);
        }    
    }
}

同样的问题。

你的aRandomClass是什么类型的课程很重要。如果它也是一个EJB,那么您应该查看。如果它是一个servlet,那么事务在EJB方法退出后立即自动关闭(无论是哪一个)。这是通过使用。因此,在场景1中,EJB容器将打开和关闭多个事务:一个用于
service.getAll()
,另一个用于每个
service.update(a)
调用。在场景2中,如果只调用一次方法
getAllAndUpdate()
,则单个事务将被打开,并在方法退出时关闭。

@AndreiL您说如果它是EJB,而不是managedBean,这很重要,对吗?因此,在场景1中,如果for循环正在进行,并且有人对一行进行了更新,那么更新是否可能在循环进行时完成,但在场景2中他必须等待?就像我想象的那样,for循环开始,生成一个事务,关闭它,然后在打开另一个事务以完成循环之前,另一个用户的更新事务发生,然后循环继续?关于托管bean,我不确定,但测试是非常容易的:然后开始调试应用程序,检查哪一步完成了。我并没有在你的评论中真正理解你的问题。如果您在场景1中处于该循环中,则每次使用for循环完成时,事务都会关闭,并且在关闭事务时,任何保留的DB锁都将丢失(但在代码中,您不会保留任何锁,除非您使用可序列化的)。请阅读。
@Stateless
public class AService implements AServiceInterface {
    @PersistenceContext(unitName = "my-pu")
    private EntityManager em;

    @Override
    public List<Aclass> getAllAndUpdate() {
        Query query = em.createQuery(SELECT_ALL_ROWS);
        List<Aclass> listAclass = query.getResultList();
        for(Aclass a : listAclass ){
           a.setProperty(methodThatTakesTime());
           em.merge(a);
        }    
    }
}