powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
6 сообщений из 6, страница 1 из 1
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38971916
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В спринге есть такая штука, что если ставишь на метод аннотацию @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.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retry{
    int retryCount() default 10;
}

@Aspect
@Slf4j
public class RetryAspect implements Ordered {
    
    @Setter @Getter private int order = -1;

    @Around(value = "@annotation(Retry)", argNames = "Retry")
    public Object retry(final ProceedingJoinPoint pjp, final Retry retry) throws Throwable {
        System.out.println("Aspect executing");
        final int retryCount = retry.retryCount();
        int callCounter = 0;
        
        Object result = null;
        while (callCounter < retryCount) {
            try {
                result = pjp.proceed();
                break;
            } 
            catch (Exception ex) {
                callCounter++;
            }
        }
        return result;
    }

 }



Использую так:

Код: java
1.
2.
3.
4.
5.
6.
@RequestMapping(value = "/test", produces="text/plain")
@Transactional
@Retry
public JSONObject crtr( @RequestParam int t ) throws IOException, InterruptedException{
...
}



Вопрос - каким экзепшенам в моем аспекте надо делать catch()?

Я попробовал - если обьект не лочить и он изменился в двух потоках, то первый коммитит, а второй бросает нечто, что оборачивается в JpaOptimisticLockingFailureException. Но. Если мы в двух потоках вставляем обьект с одинаковым id, то бросается уже MySQLIntegrityConstrainsViolationException которое дойдя до нашего catch будет тыщу раз обернуто, и словится как JpaSystemException. То есть, retry я имею право делать, только если внутри сидит MySQLIntegrityConstrainsViolationException.

При этом, если мы ставим на обьект пессимистическую блокировку, то ловится уже NucleusDataStoreException (я использую datanucleus а не хибернейт)

То есть, я моделирую разные ситуации конкурентного доступа к обьекту и сижу ловлю экзепшены, составляя их список, чтобы потом сделать catch в моем аспекте. Но есть подозрение, что я делаю что-то не то, что я что-то не учту и мой список будет не полным. Либо уже такой список где-то есть (найти не удалось), либо это делается как-то по другому - но как?
...
Рейтинг: 0 / 0
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38971923
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spring по-моему откатывает по любому RuntimeException.
...
Рейтинг: 0 / 0
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38972000
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, судя по документации это так. Но вопрос не в этом.

Вопрос в том, что есть исключения, при которых retry делать вообще нет смысла. Например NPE, исключения которые возникли по вине неверных данных, по вине программиста и тд.

А есть такие, что связаны именно с тем, что был конкурентный доступ к одинаковым Entity - и для таких retry скорей всего сработает.

И я хочу расставить catch() в своем аспекте так, чтобы он без retry выпускал наверх все исключения, кроме тех, для которых можно сделать retry.

Т.е., меня не волнует райнтайм оно или нет.
...
Рейтинг: 0 / 0
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38972007
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokА есть такие, что связаны именно с тем, что был конкурентный доступ к одинаковым Entity - и для таких retry скорей всего сработает.


Вообще это довольно-таки опасно, если сущность изменилась то ретрай может нагородить делов
...
Рейтинг: 0 / 0
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38972023
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Код: java
1.
2.
3.
if(!(exception instanceof ConcurrentUpdateSQLException)){
   throw exception;
}
...
Рейтинг: 0 / 0
где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
    #38972855
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, не все так просто. Экзепшенов получается больше.

Щас смотрю код спринга - есть набор экзепшенов по умолчанию, есть тот, что зависит от JpaDialect - в моем случае он стоит в default. И есть еще некий PersistenceExceptionTranslator. Пока не разобрался как их назначить.

Кстати, неясно зачем вообще оборачивать стандартные экзепшены (которые уже рантайм!) в свои обертки. Ладно еще, если это было бы что-то экзотическое, но стандартное-то зачем. ИМХО, это вообще антипаттерн.

авторВообще это довольно-таки опасно, если сущность изменилась то ретрай может нагородить делов

Прийму это к сведению. Но у меня предполагается ситуация, что если сущность поменялась, то после Retry оно уже или выбросит экзепшен "невозможно", по которому уже Retry не будет делаться, или обработка транзакции после retry пойдет по такой ветке, которая учитывает новые обстоятельства.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / где бы взять достаточный список исключений, чтобы нормально делать retry транзакций?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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