В аннотации @Transactional
вы можете указать, следует ли откатывать транзакцию из-за данного исключения, используя атрибут noRollbackForClassName
.Вы можете сделать это аналогично этому.
@Service
@Transactional(noRollbackForClassName = "java.lang.Exception")
public class YourClass {
...
}
Однако, обратите внимание, что просто сказать noRollbackForClassName = "java.lang.Exception"
будет означать, что он не откатится ни для какого исключения (или его подклассов), следовательно, это не очень хорошая практика.
Что вы должны сделать, это выяснить, какое исключение на самом деле выдается первым (может быть, распечатав e.getClass().getName()
), а затем установить имя этого класса в качестве значения noRollbackForClassName.
Причина разумная, этопроисходит потому, что если при попытке удаления () выдается какое-то исключение, текущая транзакция автоматически помечается как только откатная, а при попытке ее фиксации выдается исключение, которое вы видите.Чтобы обойти это, нужно явно указать, что это исключение не должно вызывать откат.