|
|
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Использую Spring Data. Есть 2 сущности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Далее: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: java 1. 2. 3. Я ожидаю, что при возникновении ошибки произойдет полный откат транзакции, но не тут-то было, клиент сохраняется в базе Client client = clientRepository.save(client);, а clientDetails естественно нет. Как быть, подскажите пожалуйста? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 14:41 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
1) Должен быть не какой-то Exception, а тот которым вы хотите откатывать. Спринг по умолчанию откатывает по любому RuntimeException 2) Надо убедиться что контейнер вообще настроен на транзакции. Может просто ваши аннотации никто и не использует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 14:46 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Blazkowicz1) Должен быть не какой-то Exception, а тот которым вы хотите откатывать. Спринг по умолчанию откатывает по любому RuntimeException 2) Надо убедиться что контейнер вообще настроен на транзакции. Может просто ваши аннотации никто и не использует? 1. В методе для эксперимента я генерирую свой эксепшн: Код: java 1. по нему и откатываюсь: Код: java 1. По поводу пункта 2. Контейнер настроен следующим образом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Все вроде как правильно, а откатываться не хочет. ХЭЛП! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 16:28 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
JulT1. В методе для эксперимента я генерирую свой эксепшн: Код: java 1. Из коментария //ЗДЕСЬ ПРОИСХОДИТ КАКОЙ-ТО EXCEPTION это не совсем очевидно. по нему и откатываюсь: [src java] JulTВсе вроде как правильно, а откатываться не хочет. А все бины точно управляются контейнером. А то ту многие пишут new Service().runMyMethod() и ждут что Спринг им транзакций принесет на тарелочке. stacktrace для CustomException можно увидеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:01 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
[quot Blazkowicz]JulT1. В методе для эксперимента я генерирую свой эксепшн: Код: java 1. Из коментария //ЗДЕСЬ ПРОИСХОДИТ КАКОЙ-ТО EXCEPTION это не совсем очевидно. по нему и откатываюсь: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:17 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
TransactionInterceptor на месте. Интересно. JPA спрингом инициализируется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:32 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Если EMF в TransactionManager и в Repository один и тот же, то надо лог смотреть. Так на вскидку, вроде, конфигурация норм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:35 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Можно вместо того чтобы гадать подебажить TransactionInterceptor. Посмотреть как он реагирует на исключение и что именно вызывает для отката. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:41 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Может проблема связана с конфигурациями. У меня их 2. 1. application-context.xml: Код: 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 2. Для MVC rest-servlet.xml: Код: 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. 31. 32. 33. 34. 35. И там и там стоит <tx:annotation-driven/>. Вообще не понятно зачем отдельный конфиг для MVC, можно ведь все в application-context.xml держать... Ладно, завтра буду пробовать ваши советы на практике. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:47 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Да, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:50 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации. спасибо, завтра буду пробовать дальше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 17:52 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации. Извините за вмешательство и глупый вопрос. BoneCPDataSource не является наследником XADataSource. С какого перепугу JdbcTransaction должен стать JtaTransaction? Я то думал, что в описании DataSource для JBoss, в этом случае обязательно надо указывать jta="true". Тогда сервер создает обвертку LocalXADataSource. Ну или на худой конец, указывать DataSource и XADataSource. JavaEE сервер сам разберется, когда надо цеплять XADataSource, а когда DataSource. Аннотации javax.transaction.Transactional распространяются только на JTA и не распространяются на JDBC. Может, в Spring все более туманно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 18:56 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
galsИзвините за вмешательство и глупый вопрос. BoneCPDataSource не является наследником XADataSource. С какого перепугу JdbcTransaction должен стать JtaTransaction? В stackoverflow подсмотрел? С какого перепугу а Юлии JTA? Скорее всего обычные локальные JDBC транзакции. gals Аннотации javax.transaction.Transactional распространяются только на JTA и не распространяются на JDBC. Может, в Spring все более туманно. Хорошая попытка, но нет Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 19:12 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Скорее всего вот эта ситуация http://stackoverflow.com/a/10564908 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 19:14 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
JulT, Я думаю, что ты путаешь контексты сервлета и корневые контексты. Их нельзя путать. Транзакции будут работать только там, где объявлен tx:annotation-driven. Подробнее можешь прочитать вот здесь: http://urvanov.ru/2015/06/17/spring-framework-общий-контекст-root-context-xml-и-контекст-серв/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2015, 20:27 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Всем огромное спасибо за комменты, очень познавательно. Итак, я убрала <tx:annotation-driven/> из rest-servlet.xml, теперь <tx:annotation-driven transaction-manager="transactionManager"/> находится в application-context.xml. Вы пишите: BlazkowiczДа, если у вас создаётся два контекста, то при вызове из контроллера работает только web контекст, в котором нет JPA конфигурации. Получается, что все, что связано с JPA: Код: java 1. 2. 3. и т.д. необходимо перенести в rest-servlet.xml? Но вот человек приводит ссылку http://urvanov.ru/2015/06/17/spring-framework-общий-контекст-root-context-xml-и-контекст-серв/ где сказано, что транзакции, настройка dataSource и прочее должны лежать в application-context.xml. Как быть? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 07:39 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Цепочка вызовов следующая. Контроллер: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Далее выполнение переходит к сервисному слою Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. здесь вызывается метод register, который аннтотирован @Transactional(propagation= Propagation.REQUIRED, rollbackFor = CustomException.class), в нем и происходит исключение. Блин, уже перепробовала кучу вариантов, откат не работает, клиенты по-прежнему плодятся в базе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 07:56 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
clientRepository - какой код ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 11:34 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Atum1clientRepository - какой код ??? Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 12:35 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
А если убрать @Transactional с класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 13:32 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Pavel KurakinА если убрать @Transactional с класса? до лампочки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 14:20 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
JulT, Воспользуйтесь пошаговой отладкой в TransactionInterceptor, делов минут на 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 14:25 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
Это просто жесть какая-то. В этом же контроллере, с этим же сервисным классом делаю простой тестовый метод: Код: java 1. 2. 3. 4. 5. и все отрабатывает как и хотелось, магия........... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 14:32 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
JulT, throws CustomException? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 14:51 |
|
||
|
Как правильно работать с @Transactional
|
|||
|---|---|---|---|
|
#18+
JulTмагия... Чудес не бывает :) Мне кажется, что транзакция стартует где-то раньше, и соответственно метод использует уже существующую транзакцию. Ну а раз не он ее начал, то и не ему ее откатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 14:55 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38990614&tid=2125259]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 501ms |

| 0 / 0 |
