|
|
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
В спринге есть такая штука, что если ставишь на метод аннотацию @Transactional, то он перед вызовом метода открывает новую транзикцию. При этом, в многопоточной среде не каждая транзакция может завершиться нормально. Спринг не предоставляет "из коробки" решений, чтобы делать retry, но где-то в гугле нашел, что это можно делать аспектом, и вышло как-то так: Код: 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. Использую так: Код: java 1. 2. 3. 4. 5. 6. Вопрос - каким экзепшенам в моем аспекте надо делать catch()? Я попробовал - если обьект не лочить и он изменился в двух потоках, то первый коммитит, а второй бросает нечто, что оборачивается в JpaOptimisticLockingFailureException. Но. Если мы в двух потоках вставляем обьект с одинаковым id, то бросается уже MySQLIntegrityConstrainsViolationException которое дойдя до нашего catch будет тыщу раз обернуто, и словится как JpaSystemException. То есть, retry я имею право делать, только если внутри сидит MySQLIntegrityConstrainsViolationException. При этом, если мы ставим на обьект пессимистическую блокировку, то ловится уже NucleusDataStoreException (я использую datanucleus а не хибернейт) То есть, я моделирую разные ситуации конкурентного доступа к обьекту и сижу ловлю экзепшены, составляя их список, чтобы потом сделать catch в моем аспекте. Но есть подозрение, что я делаю что-то не то, что я что-то не учту и мой список будет не полным. Либо уже такой список где-то есть (найти не удалось), либо это делается как-то по другому - но как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 15:01 |
|
||
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
Spring по-моему откатывает по любому RuntimeException. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 15:08 |
|
||
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
Да, судя по документации это так. Но вопрос не в этом. Вопрос в том, что есть исключения, при которых retry делать вообще нет смысла. Например NPE, исключения которые возникли по вине неверных данных, по вине программиста и тд. А есть такие, что связаны именно с тем, что был конкурентный доступ к одинаковым Entity - и для таких retry скорей всего сработает. И я хочу расставить catch() в своем аспекте так, чтобы он без retry выпускал наверх все исключения, кроме тех, для которых можно сделать retry. Т.е., меня не волнует райнтайм оно или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 16:23 |
|
||
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
chabapokА есть такие, что связаны именно с тем, что был конкурентный доступ к одинаковым Entity - и для таких retry скорей всего сработает. Вообще это довольно-таки опасно, если сущность изменилась то ретрай может нагородить делов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 16:28 |
|
||
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
chabapok, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2015, 16:42 |
|
||
|
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
|
|||
|---|---|---|---|
|
#18+
К сожалению, не все так просто. Экзепшенов получается больше. Щас смотрю код спринга - есть набор экзепшенов по умолчанию, есть тот, что зависит от JpaDialect - в моем случае он стоит в default. И есть еще некий PersistenceExceptionTranslator. Пока не разобрался как их назначить. Кстати, неясно зачем вообще оборачивать стандартные экзепшены (которые уже рантайм!) в свои обертки. Ладно еще, если это было бы что-то экзотическое, но стандартное-то зачем. ИМХО, это вообще антипаттерн. авторВообще это довольно-таки опасно, если сущность изменилась то ретрай может нагородить делов Прийму это к сведению. Но у меня предполагается ситуация, что если сущность поменялась, то после Retry оно уже или выбросит экзепшен "невозможно", по которому уже Retry не будет делаться, или обработка транзакции после retry пойдет по такой ветке, которая учитывает новые обстоятельства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2015, 22:05 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=129&tid=2125343]: |
0ms |
get settings: |
6ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 396ms |

| 0 / 0 |
