Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Controller & Transactions / 15 сообщений из 15, страница 1 из 1
05.05.2021, 14:33
    #40068579
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
Есть контроллер

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
class TestController {
    private final TestService testService;
    @PostMapping("/send")
    public void send(@RequestBody TestDto dto) throws JsonProcessingException {
        testService.method1(dto);
        testService.method2(dto);
    }
}



И соотвественно сервис
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class TestService {
    @Transactional 
    public void method1(TestDto dto) {
...
    }

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



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

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

Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
...
Рейтинг: 0 / 0
05.05.2021, 14:46
    #40068583
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
-=Koba=-,
Теоретически плохо 2 метода в контроллере. Это же уже БЛ?
Но по факту голый контроллер тоже плохо.
Поэтому делай в контроллере если надо.
...
Рейтинг: 0 / 0
05.05.2021, 14:48
    #40068584
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
Теоретический да... это уже готовая БЛ
И всплыл такой баг

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

Можете поянсить - Но по факту голый контроллер тоже плохо.
...
Рейтинг: 0 / 0
05.05.2021, 14:56
    #40068588
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
-=Koba=-,
Еденица работы это вызов POST
Поэтому непонятно, почему ты разбил Одну единицу из двух методов на две транзакции?
Ты должен вызвать всю работу в одной транзакции. Так?
...
Рейтинг: 0 / 0
05.05.2021, 15:05
    #40068592
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
-=Koba=-,
>Можете поянсить - Но по факту голый контроллер тоже плохо.
= если проект маленький, то вообще можно не разбивать на слои и все делать в контроллерах. Даже ссыль на хибер иметь.
Если большой то контроллер считается ГУИ и там бл не должно быть. Там логика запросов ЮЗВЕРЯ
...
Рейтинг: 0 / 0
05.05.2021, 15:08
    #40068594
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
-=Koba=-,
>Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
= а из метода3 вызвать 1 и потом 2?
...
Рейтинг: 0 / 0
05.05.2021, 15:10
    #40068597
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
PetroNotC Sharp
-=Koba=-,
>Логику работы методов менять нельзя (из method1 вызвать method2 не могу)
= а из метода3 вызвать 1 и потом 2?

Ок спасибо за наводку.... подумаю, так можно
...
Рейтинг: 0 / 0
05.05.2021, 16:28
    #40068635
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
со спринговым aop такое может не сработать - метод должен извне вызываться, чтоб его завернуло в траназакцию, async и т.д. - если из метода3 вызвать метод2 или 1, то транзакции не будет у каждого из них, только у метод3. Нужно AspectJ юзать
...
Рейтинг: 0 / 0
05.05.2021, 17:22
    #40068643
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
chpasha,
Ну, я и подумал что ему не надо делать типа автономной транзакции. Не так часто требуется.
...
Рейтинг: 0 / 0
05.05.2021, 17:25
    #40068644
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
chpasha,
А вот если понадобится, то я не понял что значит "извне".
Стек вызовов вроде везде одинаков.
...
Рейтинг: 0 / 0
05.05.2021, 17:52
    #40068649
Controller & Transactions
chpasha
со спринговым aop такое может не сработать - метод должен извне вызываться, чтоб его завернуло в траназакцию, async и т.д. - если из метода3 вызвать метод2 или 1, то транзакции не будет у каждого из них, только у метод3. Нужно AspectJ юзать
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию. Он же и спрашивает - как сделать одну транзакцию на оба метода. Вариант с method3 предложенный PetroNotC Sharp как раз это и сделает. И есть методы по-проще нежели AspectJ прикручивать, даже если вызов "внутренний".
...
Рейтинг: 0 / 0
05.05.2021, 18:24
    #40068654
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
Stanislav Bashkyrtsev,
Тут имхо непонятно что он спрашивал.
Как всегда на форуме, три пишем, а семь на ум пошло.
- если нужна была одна, то почему аннотация на новую.
- если две, то с какой целью.
В общем вроде пациент разобрался мирно и без эксцессов.
...
Но есть повод поболтать в рамках инженерии).
...
Рейтинг: 0 / 0
05.05.2021, 19:07
    #40068658
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
Stanislav Bashkyrtsev
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию

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

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


PetroNotC Sharp
А вот если понадобится, то я не понял что значит "извне".
Извне класса, где аннотации объявлены. Вызов service.method1 из контроллера стартует транзакцию (ну в идеале :) ), а вот если внутри самого service вызвать this.method1 откуда-то еще - то нет, поскольку спринг по умолчанию в режиме прокси работает, т.е. делает обертку вокруг класса и перехватывает только внешние вызовы к методам
...
Рейтинг: 0 / 0
05.05.2021, 23:36
    #40068680
Controller & Transactions
chpasha
Stanislav Bashkyrtsev
Ему и не надо чтоб method1 & method2 были обернуты каждый в свою транзакцию

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

chpasha
Stanislav Bashkyrtsev
И есть методы по-проще нежели AspectJ прикручивать, даже если вызов "внутренний".
Как? Инъекцию менеджера транзакций исключаем, как очевиднуюПочему мы не рассматриваем очевидные (и правильные) решения? Кроме адекватных решений у спринга есть еще хаки типа self injection, и как вариация на тему - инъекция ApplicationContext'a и явно взять себя из контекста. Ну и конечно еще можно порефакторить код и вынести 2ой метод в какой-то другой класс.
...
Рейтинг: 0 / 0
06.05.2021, 11:40
    #40068724
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Controller & Transactions
Stanislav Bashkyrtsev
Почему мы не рассматриваем очевидные (и правильные) решения?
дело не в том, как правильно. вопрос чисто по матчасти - либо есть нормальные способы заставить работать плюшку @Trasnactional "внутри", либо нет.

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

ну нет, это уже из разряда можно ли съесть лампочку ;)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Controller & Transactions / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]