Блокирует ли приостановленный @транзакционный метод ресурс?

#java #spring #transactions #spring-transactions

Вопрос:

outer Метод и inner метод AFAIK выполняются в 2 разных транзакциях на уровне бд (из-за REQUIRES_NEW). outer метод выполняет обновление и ожидает inner фиксации метода. Означает ли это, что outer удерживайте блокировку пользовательского ресурса до inner фиксации?

 @Autowired
private TestDAO testDAO;

@Autowired
private SomeBean someBean;

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void outerMethod(User user) {
  testDAO.updateUser(user);
  
  someBean.innerMethod();
  
}
 

Кто-то:

 @Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void innerMethod() {
  //some work
}
 

Обновить:

Можно ли это представить как открытые консоли 2 дб, затем введите и запустите одну за другой:

 1. begin # 1st console
 
2. update user set...# 1st console
 
3. 4. 5. begin ...#do some work; commit; # 2nd console

6. commit; # 1st console
 

Ответ №1:

Сама транзакция не отвечает за блокировку строки или таблицы. Если sql, выполняемый dao, блокирует обновляемую строку, то эта блокировка будет сохраняться до завершения транзакции или истечения времени ожидания. Обновление может быть с использованием оптимистической блокировки, и в этом случае блокировка не удерживается. Поэтому одного взгляда на этот код недостаточно, чтобы понять, блокируется ли что-то.

Но да, любая блокировка кода на уровне базы данных, пока он находится в транзакции, длится до тех пор, пока транзакция не завершится.

Комментарии:

1. спасибо, да, но вопрос больше касается запутанной транзакции «приостановка». Означает ли это, что 6 ожидает завершения 3,4,5 (см. Обновление).

2. @Екатерина: да, внешняя транзакция завершается только после 5, поэтому, пока она приостановлена, она удерживает все полученные блокировки.