У меня есть метод обработчика событий, аннотированный @Transactional, этот метод вызывает реализацию события в том же классе.
Это событие выполняет некоторые проверки и в зависимости от результата оно либо что-то делает, либоизмените состояние и сгенерируйте исключение RuntimeException.
В случае, если состояние изменилось из-за проверки, мне нужно, чтобы статус оставался постоянным, но событие не было выполнено для повторной попытки.
Метод изменения состояниянаходится в другом классе, и метод аннотируется @Transactional (распространением = Propagation.REQUIRES_NEW).
Я ожидаю, что, поскольку внутренняя транзакция завершается, изменение состояния становится постоянным, а транзакция события откатывается.
Что я вижу, так это то, что изменение статуса также откатывается, но я не понимаю, почему оно откатывает все, когда я объясняю это, чтобы создать новую транзакцию для изменения статуса.
Имейте в виду, что это устаревший проект, поэтому основные изменения в архивеtecture невозможны.
Я попытался отладить изменения транзакции, и отладчик переходит к фиксации новой транзакции, но по какой-то причине он не сохраняется в базе данных.
public class t implements it {
// Do initialisation and class injection. Y is constructor injected
private final Y y;
public t(Y y) {
this.y = y;
}
@Override
@Transactional
public void handleEvent(EventContext context) {
switch (context.getEventType()) {
case event:
validate(context);
break;
}
}
private void validate(EventContext context) {
Object o = crudService.findByProperty(context.getObjectUuid());
if (!o.check) {
y.changeStatus(ERROR);
// break for retry
throw new RuntimeException("Some serious message log");
} else {
// do some stuff
}
}
}
public class Y implements IY {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void changeStatus(Object o, String status) {
// We do a lot more here then just change this status because of inheriting objects but for the sake of the argument, change status
o.status = status;
}
}
Это черновик того, что делает код.
Я ожидаю, что изменение статуса будет сохраняться, потому что внешняя транзакция приостанавливается при запуске транзакции propogation_new.Я также вижу, что коммит вызывается в коде транзакции Spring, но по какой-то причине он не сохраняется в базе данных.
Если я удаляю выброс исключения во время выполнения, он работает, но событие завершается, что нежелаемый.
Чего мне не хватает на этой картинке?Надеюсь, что вы можете помочь.
Спасибо!
РЕДАКТИРОВАТЬ
Я думаю, что нашел проблему, немного изменил пример кода, чтобы сделать его более понятным.
changeStatus изменяет статус объекта, который возвращается crudService.В реальном приложении мы делаем намного больше изменений, потому что объекты, которые зависят от объекта o, также должны меняться при изменении статуса.
Поскольку внешняя транзакция имеет состояние o, означает ли это, что если я внесу изменениявнутри внутренней транзакции, поскольку внешняя транзакция содержит ссылку, она будет откатываться до этого состояния вместо сохранения изменений внутренней транзакции?