|
|
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Коллеги, Ай нид Хелп, Есть два чудесных метода на уровне Service, один из которых выполняется по расписанию: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Проблема в том, что есть так же метод postingSchedule(postingScheduleList.get(i)); Который выполняется в рамках одной и той же транзакции метода doProcessing(); Кагбэ сделать так чтобы метод postingSchedule открывал свою транзакцию(т.е. новую), и по успешному выходу из метода, commit'ил все наделанные за собой дела? PS. Мне почему то, кажется, что данное поведение должен обеспечивает атрибут propagation т.е. нужно заменить @Transactional на @Transactional(propagation = Propagation.REQUIRES_NEW) у метода doProcessing(). Но я так пробовал - не работает. Т.е. пока doProcessing() не закончит свои дела коммитов в postingSchedule не появляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 01:58:55 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepka, а как вы наблюдаете появление коммитов? алсо, maxximum indus mode: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Сделайте хотябы так штоле Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 02:35:11 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Лагманtepka, а как вы наблюдаете появление коммитов? Объект PostingScheduleEntity (postingScheduleList.get(i)) - это одна строка в табличке из нескольких колонок. Среди колонок есть колонка - статус (который я и меняю postingScheduleList.get(i).setStatus(statusId)) А перед выходом из метода doProcessing() ставлю брэкпоинт и смотрю в базе SELECT'ом (Toad или pl/sql Developer) в абсолютно новой сессии к базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 02:52:43 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepka, какой профит вы хотите получить от вложенной транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 09:32:14 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaМне почему то, кажется, что данное поведение должен обеспечивает атрибут propagation т.е. нужно заменить @Transactional на @Transactional(propagation = Propagation.REQUIRES_NEW) у метода doProcessing(). Но я так пробовал - не работает. Т.е. пока doProcessing() не закончит свои дела коммитов в postingSchedule не появляется. Всё верно. Но во-первых REQUIRES_NEW (или даже NESTED) должен стоять у postingSchedule. Во-вторых это всё равно не отработает так как оба метода у вас в одном классе. Транзакции спринг обеспечивает оборачивая классы в прокси. Но когда один метод класса вызывает другой метод того же класса, то вызов идёт мимо прокси и спринг никак не может его перехватить и обработать. Направление мысли у вас правильное. Нужно использовать Propagation. Но класс стоит разбить на отдельные. Один будет отвечать только за scheduled задачи. Второй за саму обработку. Тогда управление транзакциями будет работать без проблем. Можно, конечно и по-извращатся, вызывая вместо this.postingSchedule() этот же метод но у проксированого бина полученого из контекста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 09:53:16 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Petro123какой профит вы хотите получить от вложенной транзакции? не очень понял вопроса) но отвечу) Коммиты хочу получить от вложенной транзакции) BlazkowiczНо когда один метод класса вызывает другой метод того же класса, то вызов идёт мимо прокси и спринг никак не может его перехватить и обработать. ИМХО не совсем так.(хотя я могу и ошибаться) В доке написано, что аннотация @Transactional на методе, срабатывает по умолчанию (т.е. есть видимо какой то способ, не только по умолчанию) только, когда этот метод вызывается из вне. А не внутри класса. BlazkowiczНаправление мысли у вас правильное. Нужно использовать Propagation. Но класс стоит разбить на отдельные. Если класс разбить на два класса, то Propagation будет не нужен. Не ясно тогда назначение этого атрибута Propagation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 13:28:03 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaИМХО не совсем так.(хотя я могу и ошибаться)всё именно так тебе надо ещё раз перечитать первый абзац от Blazkowicz'а ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 13:32:27 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaКоммиты хочу получить от вложенной транзакции) То есть NESTED? Или всё же просто независимая транзакция нужна? Тогда REQUIRES_NEW. tepkaИМХО не совсем так. Подкрепить стоит чем-то кроме своего имха. tepkaВ доке написано, что аннотация @Transactional на методе, срабатывает по умолчанию (т.е. есть видимо какой то способ, не только по умолчанию) Ну, как бы да. Методы все считаются как Propagation.REQUIRED - есть транзакиця, используется. Нет - создаётся новая. И можно ссылку на доку, которую вы используете. Уж больно вольная у вас трактовка. tepkaтолько, когда этот метод вызывается из вне. А не внутри класса. Ну, так а я о чем? tepkaЕсли класс разбить на два класса, то Propagation будет не нужен. Не ясно тогда назначение этого атрибута Propagation. Т.е. назначение не ясно, но вы твердо уверены что не нужен? По-умолчанию используется Propagation.REQUIRED. То что вы хотите это REQUIRES_NEW или NESTED. Какая именно из них вам нужнее, пока не ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 13:40:57 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
grasoff.netтебе надо ещё раз перечитать первый абзац от Blazkowicz'а В оригинале звучит так: In proxy mode (which is the default) , only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with @Transactional. Сиё я могу интерпретировать так: 1) Что есть еще какой то способ по мимо proxy mode. 2) Аннотация @Transactional имеет смысл быть только у внешних методов. Т.е. если она будет стоять у внутренних методов класса она будет просто проигнорирована. Т.е. фраза "REQUIRES_NEW (или даже NESTED) должен стоять у postingSchedule" от Blazkowicz не имеет смысла. Так как атрибут propagation ставится у аннотации Transactional внутреннего метода. А так же я все таки попробовал поставить Propagation.REQUIRES_NEW у метода postingSchedule и это не помогло. Пока doProcessing() не закончит свою работу, коммиты (postingDAO.saveOrUpdate(postingScheduleEntity)) внутри postingSchedule не появляются. PS. Я не ставлю под сомнение авторитет Blazkowicz это великий человек. Он мне много раз помогал. Но я просто хочу разобраться с какой целью придумали Propagation, если он не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:08:30 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaPetro123какой профит вы хотите получить от вложенной транзакции? не очень понял вопроса) но отвечу) Коммиты хочу получить от вложенной транзакции) переведу: - зачем коммиты? Если не делать вложенную (всё в одной). то и коммит не нужен (старт тоже). "Лечение перхоти гильотиной" Или препод задал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:17:02 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaНо я просто хочу разобраться с какой целью придумали Propagation, если он не работает. ok. Понятно. Сабж с целью изучения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:19:26 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepka1) Что есть еще какой то способ по мимо proxy mode. В другом режим байт код модифицируется после компиляции, либо во время загрузки классов. Новый код добавляется непосредственно в методы. Тогда проблемы с внутренними вызовыми быть не должно. Т.к. AOP уже реализован в методах, и прокси не нужны. tepka2) Аннотация @Transactional имеет смысл быть только у внешних методов. Внутренний\внешний методы это не объективный атрибут метода. Это только способ, которым метод вызывается. tepkaТ.е. если она будет стоять у внутренних методов класса она будет просто проигнорирована. Не совсем. Просто вызов пойдёт мимо прокси, в которой реализован AOP. Можно вызвать тот же метод, использую ссылку на прокси. Метод от этого не перестанет быть "внутренним". Но АОП уже отработает нормально. tepkaТ.е. фраза "REQUIRES_NEW (или даже NESTED) должен стоять у postingSchedule" от Blazkowicz не имеет смысла. Выводы у тебя не адекватные. Я подробно изложил, почему это не будет работать в твоём случае и как эту проблему решить. tepkaТак как атрибут propagation ставится у аннотации Transactional внутреннего метода. Нет такого понятия как "внутренний метод". Есть понятие "внутренний вызов" - вызов метода внутри класса через ссылку this, мимо спринговой прокси, которая реализует AOP. tepkaА так же я все таки попробовал поставить Propagation.REQUIRES_NEW у метода postingSchedule и это не помогло. Удивительно. Наверное потоум что "вызов метода внутри класса через ссылку this идёт, мимо спринговой прокси, которая реализует AOP", о чем я уже раз 5й в этой теме пишу. tepkaПока doProcessing() не закончит свою работу, коммиты (postingDAO.saveOrUpdate(postingScheduleEntity)) внутри postingSchedule не появляются. Ещё раз объяснить почему? tepkaНо я просто хочу разобраться с какой целью придумали Propagation, если он не работает. Ну, вот почему сразу "он не работает". С чего ты решил, что Propagation не работает. Не работет Spring AOP когда он реализован через прокси а вызовы методов происходят мимо прокси. Что просто и логично. Это никак не связано с тем что не работает Propagation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:50:54 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
В целом, совет один. Отложи в сторону вопрос транзакций, и разберись с тем что такое АОП и как именно оно реализовано в Spring. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:52:03 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТо есть NESTED? Или всё же просто независимая транзакция нужна? Тогда REQUIRES_NEW. Да мне все равно какая транзакция, новая или не зависимая) Мне нужны коммиты во внутренним методе) А они есть как у NESTED так и у REQUIRES_NEW. Цель же простая. Есть метод doProcessing в нём крутиться цикл. Который просто вызывает метод postingSchedule. И надо чтобы при выходе из postingSchedule делались коммиты. Суть в том, что цикл может крутиться очень долго, а объекты PostingScheduleEntity дёргаются еще и из другого места и так же по расписанию (в другой транзакции, вообще с другого апликейшен сервера), но по фильтру статуса. И пока статусы не про апдейтяться фиг, что дёрнется с базы. BlazkowiczПодкрепить стоит чем-то кроме своего имха. Цитата из доке выше. BlazkowiczИ можно ссылку на доку, которую вы используете. Уж больно вольная у вас трактовка. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html и её перевод http://www.lexvit.dn.ua/articles/?art_id=springtrn2_mht201007207552 Blazkowicztepkaтолько, когда этот метод вызывается из вне. А не внутри класса. Ну, так а я о чем? Да я про то что, ты описал принцип работы только proxy mode. А по мимо него есть другие mode. А так же про то что аннотацию Transactional можно ставить только на внешние методы. Не имеет смысл вешать REQUIRES_NEW на метод postingSchedule. Он все равно будет про игнорирован (хотя я могу и ошибаться я это читал на каком то буржуйском форуме, уже найти не могу) BlazkowicztepkaЕсли класс разбить на два класса, то Propagation будет не нужен. Не ясно тогда назначение этого атрибута Propagation. Т.е. назначение не ясно, но вы твердо уверены что не нужен? Назначение его ясно) Не ясно почему он не работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 14:55:32 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
ладно) пойду думать над сказанным от Blazkowicz) Чего то я не догоняю точно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 15:01:46 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Я думал, что для класса Код: java 1. 2. 3. 4. 5. Спринг генерит Код: java 1. 2. 3. 4. 5. 6. 7. В таком варианте проблем не должно быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 15:57:56 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepkaЧего то я не догоняю точно) С английским текстом тоже нужно поточнее обращатся. external method call это не "внешний метод", это "внешний вызов метода". Что любопытно в указанном переводе это тоже достаточно корректно отражено. А у тебя появились какие-то внутренние и внешние методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:05:48 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪЯ думал, что для класса Код: java 1. 2. 3. 4. 5. Спринг генерит Код: java 1. 2. 3. 4. 5. 6. 7. В таком варианте проблем не должно быть Как раз проблема в том, что если вызывать FooService.foostuff(), то прокси про это никогда ничего не узнает. Что и происходит у автора темы. А вот если настроить AspecJ weaving, то do some magic будет добавлен непосредственно в FooService. Тогда проблемы стем чтобы получить ссылку на прокси не будет. Так как не будет и самой прокси. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:10:36 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz А у тебя появились какие-то внутренние и внешние методы. Я выразился не точно. Для меня просто внешний метод = внешнему вызову метода. Я думал для всех это очевидно, так как нет такого понятия внешний метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:39:08 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepka, ты хочешь убрать изоляцию транзакций (невидимость изменений между незакоммиченными)? Т.е. статус-колонка была видна всем до коммита-конца внешней транзакции doProcessing? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:52:48 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Petro123tepka, Т.е. статус-колонка была видна всем до коммита-конца внешней транзакции doProcessing? ну да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:54:17 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
tepka, но ведь неудобно: - в коде любой программист видит вложенный код, и понимает его как ОДНУ транзакцию. И тут такие фокусы - невозможно будет откатить внешнюю корректно. Статусы будут неверные - ещё куча ограничений для http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BD%D0%BE%D0%BC%D0%BD%D1%8B%D0%B5_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B8 Если код - разные автономные транзакции с коммитом, то и разбей его семантически на разные куски (классы и т.д.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 16:59:44 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Спринг конечно может перемешать всю логику кода через модификацию его. Но как потом прогеру врубаться в логику? IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 17:02:22 |
|
||
|
Механизм транзакций. Spring MVC.
|
|||
|---|---|---|---|
|
#18+
Petro123- в коде любой программист видит вложенный код, и понимает его как ОДНУ транзакцию. И тут такие фокусы Так вот я по сути и хочу разделить ОДНУ транзакцию на две) А как это сделать, не поделив два метода на два класса не знаю. Одна транзакция читает: List<PostingScheduleEntity> postingScheduleList = postingDAO.getAllPostingSchedule(); Она получает список job'ов которые надо публиковать. Вторая транзакция пишет: postingSchedule(postingScheduleList.get(i)); Он апдейтит статусы на основе некоторой логики. Petro123- невозможно будет откатить внешнюю корректно. Статусы будут неверные В внешная транзакция она читатель. Её не надо откатывать. Petro123Если код - разные автономные транзакции с коммитом, то и разбей его семантически на разные куски (классы и т.д.). Класс, в котором один метод... это конечно здорово. Но дух фен шея не сможет спокойно передвигать в пакете в котором все завалено классами с одним методом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2012, 17:12:25 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=274&tid=2131146]: |
0ms |
get settings: |
17ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
18ms |
get forum data: |
5ms |
get page messages: |
112ms |
get tp. blocked users: |
3ms |
| others: | 317ms |
| total: | 534ms |

| 0 / 0 |
