gpt4 book ai didi

database - 什么时候提交事务?

转载 作者:搜寻专家 更新时间:2023-10-30 23:43:43 27 4
gpt4 key购买 nike

我读过 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com