什么时候提交事务?
At what point is a transaction commited?
我读过 entities lifecycle, and the locking strategies,也看过一些视频,但我仍然不确定我 understand.I 是否了解底层 RDBMS 中也有锁定机制(我'我使用 mysql).
我想知道什么时候事务被提交/实体被分离,以及它如何从锁定的角度影响其他事务。用户必须在什么时候等待交易完成?我在下面做了两个不同的场景。为了便于理解,我断言场景中的 table 包含很多行,并且 for
循环需要 10 分钟才能完成。
场景一:
@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);
}
}
和调用 class:
public aRadomClass{
@EJB
AServiceInterface service;
public void method(){
List<Aclass> listAclass = service.getAll();
for(Aclass a : listAclass){
a.setProperty(methodThatTakesTime());
service.update(a);
}
}
}
未指定锁定策略:如果另一个用户想要更新 table 中的 one 行并且 for 循环已经开始但尚未完成。他必须等到 for
循环完成吗?
场景二:
@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);
}
}
}
同样的问题。
重要的是 class 你的 aRandomClass 是什么类型。如果它也是一个EJB,你应该看看transaction propagation. If it is a servlet, then the transaction is closed automatically right after your EJB method exits (no matter which one). That is done using dynamic proxies。因此在场景 1 中,EJB 容器将打开和关闭多个事务:一个用于 service.getAll()
,一个用于每个 service.update(a)
调用。在场景 2 中,如果方法 getAllAndUpdate()
只被调用一次,将打开一个事务,并在方法退出时关闭。
我读过 entities lifecycle, and the locking strategies,也看过一些视频,但我仍然不确定我 understand.I 是否了解底层 RDBMS 中也有锁定机制(我'我使用 mysql).
我想知道什么时候事务被提交/实体被分离,以及它如何从锁定的角度影响其他事务。用户必须在什么时候等待交易完成?我在下面做了两个不同的场景。为了便于理解,我断言场景中的 table 包含很多行,并且 for
循环需要 10 分钟才能完成。
场景一:
@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);
}
}
和调用 class:
public aRadomClass{
@EJB
AServiceInterface service;
public void method(){
List<Aclass> listAclass = service.getAll();
for(Aclass a : listAclass){
a.setProperty(methodThatTakesTime());
service.update(a);
}
}
}
未指定锁定策略:如果另一个用户想要更新 table 中的 one 行并且 for 循环已经开始但尚未完成。他必须等到 for
循环完成吗?
场景二:
@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);
}
}
}
同样的问题。
重要的是 class 你的 aRandomClass 是什么类型。如果它也是一个EJB,你应该看看transaction propagation. If it is a servlet, then the transaction is closed automatically right after your EJB method exits (no matter which one). That is done using dynamic proxies。因此在场景 1 中,EJB 容器将打开和关闭多个事务:一个用于 service.getAll()
,一个用于每个 service.update(a)
调用。在场景 2 中,如果方法 getAllAndUpdate()
只被调用一次,将打开一个事务,并在方法退出时关闭。