Я читал о 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);
}
}
}
Тот же вопрос.
Подробнее о [управлении параллелизмом] (https://en.wikipedia.org/wiki/Concurrency_control). – philipxy