Любой RuntimeException
внутри транзакции, , о котором Spring узнает , помечает эту транзакцию для отката.
Учитывая, что распространение транзакции для repository.save()
равно ТРЕБУЕТСЯ и вызов repository.save()
привел к DataIntegrityViolationException
, который является подклассом для RuntimeException
, транзакция будет помечена для отката, даже если она обрабатывается / перехватывается на methodTwo()
.
noRollbackFor / noRollbackForClassName атрибуты аннотации @ Transactional могут использоваться для управления поведением отката. Например,
@Transactional(noRollbackFor=DataIntegrityViolationException.class)
Примечание: RuntimeException, о которых Spring узнает , заключается в том, что, если RuntimeException
явно генерируется и обрабатывается в том же методе, Spring не будет знать об этом исключение и не помечает окружающую транзакцию для отката. RuntimeException
должно распространяться через пружинные прокси, чтобы это произошло, что произошло с вашим вариантом использования.