Skip to content

Latest commit

 

History

History
53 lines (30 loc) · 2.48 KB

transactions_interaction_modify_nested.adoc

File metadata and controls

53 lines (30 loc) · 2.48 KB
Чтение и изменение данных во вложенной транзакции

Рассмотрим сначала зависимую вложенную транзакцию, создаваемую через getTransaction():

link:../../../../../../source/middleware/transactions_4.java[role=include]
  1. загружаем сущность, где name == "old name"

  2. указываем новое значение для поля

  3. вызываем метод, создающий вложенную транзакцию

  4. получаем тот же экземпляр EntityManager, что и в methodA

  5. загружаем сущность с тем же идентификатором

  6. значение поля новое, так как мы работаем в том же persistent context, и запросов к БД не было

  7. commit в этот момент не происходит

  8. изменения сохраняются в БД, в них будет содержаться "name B"

Теперь рассмотрим тот же самый пример с независимой вложенной транзакцией, создаваемой через createTransaction():

link:../../../../../../source/middleware/transactions_5.java[role=include]
  1. загружаем сущность, где name == "old name"

  2. указываем новое значение для поля

  3. вызываем метод, создающий вложенную транзакцию

  4. создаём новый экземпляр EntityManager, т.к. это новая транзакция

  5. загружаем сущность с тем же идентификатором

  6. значение поля старое, так как из БД загружен старый экземпляр сущности

  7. изменения сохраняются в БД, значение "name B" теперь будет храниться в БД

  8. из-за оптимистичной блокировки выбрасывается исключение, commit не выполняется

В последнем случае исключение в точке (8) возникнет, только если сущность является оптимистично блокируемой, т.е. если она реализует интерфейс Versioned.