@Транзакционный без отката при ошибках, но работает для исключений времени выполнения

#java #transactions #jboss #java-ee-8

Вопрос:

Мы используем код в общедоступном методе, который аннотирован @javax.transaction.Транзакционный вызов из другого класса.

Код выполняется с Java EE на JBoss 7.2 и Wildfly 15.

При исключениях времени выполнения транзакции откатываются правильно, как и ожидалось. Когда я вручную выбрасываю новую ошибку OutOfMemoryError (в качестве теста!) или ошибку утверждения, возникает ошибка, но транзакция фиксируется. Ожидание-это откат.

С точки зрения реализации я вижу org.jboss.jts//com.arjuna.ats.jta.cdi.транзакционный.Транзакционные* классы в моей трассировке стека.

Есть идеи, почему это так и как принудительно выполнить откат также при ошибках?

Ответ №1:

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

Надеюсь, документация поможет.

Комментарии:

1. Спасибо за этот полезный совет. Это объясняет, почему происходит откат. Я следил за этим, но не получал отката для OOM даже с помощью @Transactional(откат = OutOfMemoryError.class) — независимо от этого я на самом деле хотел бы @Transactional(откат = Throwable.class)