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

Откуда: Минск
Сообщений: 2018
Есть контроллер

class TestController {
    private final TestService testService;
    @PostMapping("/send")
    public void send(@RequestBody TestDto dto) throws JsonProcessingException {
        testService.method1(dto);
        testService.method2(dto);
    }
}


И соотвественно сервис
class TestService {
    @Transactional 
    public void method1(TestDto dto) {
...
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method2(TestDto dto) {
...
    }
}


Собственно вопрос
Если в контроллер проходит метод - method1, а method2 падает
Можно ли откатывать и изменения method1?

Читал, что управление транзакция на уровне контроллера плохая идея
Поэтому и возник вопрос

Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
5 май 21, 14:33    [22318791]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
-=Koba=-,
Теоретически плохо 2 метода в контроллере. Это же уже БЛ?
Но по факту голый контроллер тоже плохо.
Поэтому делай в контроллере если надо.
5 май 21, 14:46    [22318801]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
-=Koba=-
Member

Откуда: Минск
Сообщений: 2018
Теоретический да... это уже готовая БЛ
И всплыл такой баг

Что изменения должны быть все или ничего
В моем случае, транзакция метода 1 проходит, метод 2 падает

Можете поянсить - Но по факту голый контроллер тоже плохо.
5 май 21, 14:48    [22318803]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
-=Koba=-,
Еденица работы это вызов POST
Поэтому непонятно, почему ты разбил Одну единицу из двух методов на две транзакции?
Ты должен вызвать всю работу в одной транзакции. Так?
5 май 21, 14:56    [22318811]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
-=Koba=-,
>Можете поянсить - Но по факту голый контроллер тоже плохо.
= если проект маленький, то вообще можно не разбивать на слои и все делать в контроллерах. Даже ссыль на хибер иметь.
Если большой то контроллер считается ГУИ и там бл не должно быть. Там логика запросов ЮЗВЕРЯ
5 май 21, 15:05    [22318819]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
-=Koba=-,
>Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
= а из метода3 вызвать 1 и потом 2?
5 май 21, 15:08    [22318824]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
-=Koba=-
Member

Откуда: Минск
Сообщений: 2018
PetroNotC Sharp
-=Koba=-,
>Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
= а из метода3 вызвать 1 и потом 2?

Ок спасибо за наводку.... подумаю, так можно
5 май 21, 15:10    [22318828]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
chpasha
Member

Откуда:
Сообщений: 10838
со спринговым aop такое может не сработать - метод должен извне вызываться, чтоб его завернуло в траназакцию, async и т.д. - если из метода3 вызвать метод2 или 1, то транзакции не будет у каждого из них, только у метод3. Нужно AspectJ юзать
5 май 21, 16:28    [22318889]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
chpasha,
Ну, я и подумал что ему не надо делать типа автономной транзакции. Не так часто требуется.
5 май 21, 17:22    [22318910]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
chpasha,
А вот если понадобится, то я не понял что значит "извне".
Стек вызовов вроде везде одинаков.
5 май 21, 17:25    [22318912]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
chpasha
со спринговым aop такое может не сработать - метод должен извне вызываться, чтоб его завернуло в траназакцию, async и т.д. - если из метода3 вызвать метод2 или 1, то транзакции не будет у каждого из них, только у метод3. Нужно AspectJ юзать
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию. Он же и спрашивает - как сделать одну транзакцию на оба метода. Вариант с method3 предложенный PetroNotC Sharp как раз это и сделает. И есть методы по-проще нежели AspectJ прикручивать, даже если вызов "внутренний".

Сообщение было отредактировано: 5 май 21, 17:45
5 май 21, 17:52    [22318930]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Stanislav Bashkyrtsev,
Тут имхо непонятно что он спрашивал.
Как всегда на форуме, три пишем, а семь на ум пошло.
- если нужна была одна, то почему аннотация на новую.
- если две, то с какой целью.
В общем вроде пациент разобрался мирно и без эксцессов.
...
Но есть повод поболтать в рамках инженерии).
5 май 21, 18:24    [22318946]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
chpasha
Member

Откуда:
Сообщений: 10838
Stanislav Bashkyrtsev
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию

мне это не очевидно хотя бы потому, что у них propagation разные - я как-то по наивности полагал, что там REQUIRES_NEW не от балды вставлено

Stanislav Bashkyrtsev
И есть методы по-проще нежели AspectJ прикручивать, даже если вызов "внутренний".
Как? Инъекцию менеджера транзакций исключаем, как очевидную


PetroNotC Sharp
А вот если понадобится, то я не понял что значит "извне".
Извне класса, где аннотации объявлены. Вызов service.method1 из контроллера стартует транзакцию (ну в идеале :) ), а вот если внутри самого service вызвать this.method1 откуда-то еще - то нет, поскольку спринг по умолчанию в режиме прокси работает, т.е. делает обертку вокруг класса и перехватывает только внешние вызовы к методам
5 май 21, 19:07    [22318954]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
Stanislav Bashkyrtsev
Member

Откуда: СПб
Сообщений: 137
chpasha
Stanislav Bashkyrtsev
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию

мне это не очевидно хотя бы потому, что у них propagation разные - я как-то по наивности полагал, что там REQUIRES_NEW не от балды вставлено
Мы конечно подождем еще что скажет автор, но это как бы намекает на одну транзакцию:
-=Koba=-
Если в контроллер проходит метод - method1, а method2 падает
Можно ли откатывать и изменения method1
А propagation поставлен наверно от балды. Он просто еще не разобрался с тем как транзакционность настраивается. Конкретно в данном куске кода мог стоять и обычный REQUIRES.

chpasha
Stanislav Bashkyrtsev
И есть методы по-проще нежели AspectJ прикручивать, даже если вызов "внутренний".
Как? Инъекцию менеджера транзакций исключаем, как очевидную
Почему мы не рассматриваем очевидные (и правильные) решения? Кроме адекватных решений у спринга есть еще хаки типа self injection, и как вариация на тему - инъекция ApplicationContext'a и явно взять себя из контекста. Ну и конечно еще можно порефакторить код и вынести 2ой метод в какой-то другой класс.

Сообщение было отредактировано: 5 май 21, 23:35
5 май 21, 23:36    [22319045]     Ответить | Цитировать Сообщить модератору
 Re: Controller & Transactions  [new]
chpasha
Member

Откуда:
Сообщений: 10838
Stanislav Bashkyrtsev
Почему мы не рассматриваем очевидные (и правильные) решения?
дело не в том, как правильно. вопрос чисто по матчасти - либо есть нормальные способы заставить работать плюшку @Trasnactional "внутри", либо нет.

Stanislav Bashkyrtsev
хаки типа self injection

ну нет, это уже из разряда можно ли съесть лампочку ;)
6 май 21, 11:40    [22319154]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить