Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Hibernate transactional  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1930
Всем привет!

Есть метод_1 с @Transactional
внутри него выполняются метод_2 другого сервиса, который тоже имеет @Transactional,
так он может вызываться отдельно через другой запрос api.

Ну и естественно получаем:
optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

Как бы указать в аннотации такое поведение, что если метод_2 выполняется в другой транзакции, то его транзакция бы игнорировалась, так скажем?

Я не очень силён в этом ((
29 окт 19, 11:55    [22004905]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2463
Nixic,
Разве это хибера аннотация?
Найди чья аннотация. Прочти что вложение их не влияет на транзакцию...
Работай.
29 окт 19, 12:21    [22004923]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2463
Nixic
если метод_2 выполняется в другой транзакции, то его транзакция бы игнорировалась, так скажем?
почему? Приведи пример.
29 окт 19, 12:22    [22004924]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2463
Enum Constant Резюме
MANDATORY
Поддержите текущую транзакцию, сгенерируйте исключение, если оно не существует
NESTED
Выполнить внутри вложенной транзакции, если текущая транзакция существует, вести себя как PROPAGATION_REQUIRED в противном случае.
NEVER
Выполнить без транзакций, выдать исключение, если транзакция существует.
NOT_SUPPORTED
Выполнить без транзакций, приостановить текущую транзакцию, если она существует.
REQUIRED
Поддержите текущую транзакцию, создайте новую, если ее не существует.
REQUIRES_NEW
Создайте новую транзакцию, приостановите текущую транзакцию, если она существует.
SUPPORTS
Поддержка текущей транзакции, выполнение без транзакций, если ее не существует.
29 окт 19, 12:25    [22004925]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1930
Так, всё)) я затупил, да транзакция спринговая.
В итоге оказалось, что проблема была сбоку, я не мог понять, почему метод_2 у меня не удалял записи.
Подебажил и понял, что записи, которые тоже нужно удалить(пометить удаленными) находятся во время удаление через айдишник объекта, а объект удаляется раньше.
Из-за этого записи не находятся и соответственно не удаляются. Я решил, что проблема в транзакциях и поставил метод удаления записей вперед.
Получил вышеуказанную ошибку и решил, что это ошибка именно из-за наличия разных транзакций.

В итоге сделал так, что сначала собираю объекты в лист, затем делаю манипуляции с основным объектом и далее уже запрошенные ранее записи помечаю удаленными в этой же транзакции, не зависимо от того, существует ли еще привязанный к ним удаленный объект или нет.

Спасибо, что откликнулись :)
29 окт 19, 12:27    [22004929]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1930
PetroNotC Sharp
Enum Constant Резюме
MANDATORY
Поддержите текущую транзакцию, сгенерируйте исключение, если оно не существует
NESTED
Выполнить внутри вложенной транзакции, если текущая транзакция существует, вести себя как PROPAGATION_REQUIRED в противном случае.
NEVER
Выполнить без транзакций, выдать исключение, если транзакция существует.
NOT_SUPPORTED
Выполнить без транзакций, приостановить текущую транзакцию, если она существует.
REQUIRED
Поддержите текущую транзакцию, создайте новую, если ее не существует.
REQUIRES_NEW
Создайте новую транзакцию, приостановите текущую транзакцию, если она существует.
SUPPORTS
Поддержка текущей транзакции, выполнение без транзакций, если ее не существует.

Да, это тоже полезная информация, её читал, думал про вложенные транзакции, но уже решилось, спасибо. Косяк был в методе)
29 окт 19, 12:28    [22004930]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1288
Nixic,

Ошибка Optimistic Lock о чем говорит? Ты прочитал значение из БД в двух бизнес транзакциях (например version = 7).

Теперь по одному из путей обновляешь в БД запись до (version =8).

И при этом еще раз пытаешься обновить БД своей старой записью (где version=7). Что то у тебя не так в бизнес процессах.


Можно кончено поиграться @Transaction(rollbackFor="SomeException.class") но у тебя не там проблема, а в бизнес процессе.
29 окт 19, 12:29    [22004931]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1288
Nixic,

Пока написал уже все решилось
29 окт 19, 12:31    [22004933]     Ответить | Цитировать Сообщить модератору
 Re: Hibernate transactional  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1930
vas0
Nixic,
Пока написал уже все решилось

Возможно кому-то пригодится :)
29 окт 19, 13:40    [22005015]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить