добавить действие в откат транзакции

У меня проблема с запуском некоторого кода прямо перед откатом транзакции в моем приложении. Я хочу иметь откат при возникновении исключения, но я также хочу сохранить некоторую информацию в таблице о состоянии приложения, когда произошло это исключение, включая любые ошибки или трассировку стека.

Вот код, который у меня есть:

public void performAction(String approverId, Document document, String action) {
        try {
            LOG.info(String.format("routing document %s %s %s", approverId, document.getDocumentId(), action));
            getDocumentService().route(approverId, document, action);
        } catch (Exception e) {
            LOG.error(String.format("error routing document %s %s %s", approverId, document.getDocumentId(), action));
            LOG.error(e, e);
            saveException(document, action, e); //this is what I want
        }
    }

Метод saveException() просто создает объекты и сохраняет их в таблицу.

Теперь, согласно документации Spring о транзакциях, этот откат происходит по умолчанию, где исключение является исключением времени выполнения, и я подтвердил, что откат работает правильно, но он почему-то не позволяет моему коду запускаться и сохранять нужную мне информацию или откатывать ее (?).

Любая помощь или намеки на решение приветствуются.


person Saeed    schedule 16.12.2013    source источник


Ответы (1)


Это нередкий случай использования: транзакция не удалась, и мы хотим ее откатить, но мы все равно хотели бы обновить какую-то таблицу базы данных мониторинга с указанием причины ошибки.

Для этого в приложении Spring используйте распространение REQUIRES_NEW. аннотации @Transactional.

@Transactional REQUIRES_NEW распространения

Для этого создайте службу отслеживания состояния приложения и аннотируйте ее распространением транзакции REQUIRES_NEW.

Каждый метод в службе отслеживания состояния будет выполняться в собственной отдельной транзакции, поэтому при откате транзакции основного бизнес-метода информация об отслеживании состояния по-прежнему будет доступна в базе данных.

person Angular University    schedule 16.12.2013