database - 什么时候提交事务?

标签 database jakarta-ee jpa ejb entity

我读过 entities lifecycle , 和 the locking strategies ,我看了一些关于这个的视频,但我仍然不确定我是否理解。我知道底层 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);     
    }
}

和一个调用类:

public aRadomClass{
    @EJB
    AServiceInterface service;

    public void method(){
       List<Aclass> listAclass = service.getAll();
       for(Aclass a : listAclass){
           a.setProperty(methodThatTakesTime());
           service.update(a); 
       }
    }
}

未指定锁定策略:如果另一个用户想要更新表中的一个 行并且 for 循环已经开始但尚未完成。他是否必须等到 for 循环完成?

场景 2:

@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,你应该看看 transaction propagation .如果它是一个 servlet,那么事务会在您的 EJB 方法退出后立即自动关闭(无论是哪一个)。这是使用 dynamic proxies 完成的.因此,在场景 1 中,EJB 容器将打开和关闭多个事务:一个用于 service.getAll(),一个用于每个 service.update(a) 调用。在场景 2 中,如果只调用一次方法 getAllAndUpdate(),将打开一个事务,并在方法退出时将其关闭。

关于database - 什么时候提交事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31835413/

相关文章:

php - SQL 连接 QUERY 多个表和 SELECT

javascript - 在不使用操作监听器的情况下使用 JSF 2.0 执行 AJAX

java - 多排序可选查询 - 带分页的 Spring REST Controller 配置

database - MySQL Insert in table if it doesn't exist if it does not already ¿我做得对吗?

mysql - 在连接查询中设置表名

java - 如何使用JSP/Servlet将文件上传到服务器?

java - Web 服务方法上可能存在不兼容的数组类型错误

java - Spring存储库按第一个实体进行选择并尝试映射到另一个实体(实体具有相同的名称)

Spring+Jersey 事务注解

php - 检索多个数据以 ListView ?