Хотя у Kotlin нет проверенных исключений , у него все еще есть класс RuntimeException . Начиная с Spring, вы можете прочитать в документации об управлении транзакциями, что:
В конфигурации по умолчанию код инфраструктуры транзакций Spring Framework помечает транзакцию для отката только в случаевремя выполнения, непроверенные исключения;то есть, когда выброшенное исключение является экземпляром или подклассом RuntimeException.
Зная, что мы можем попытаться изменить базовый класс нашего исключения с Exception
на RuntimeException
, чтобы увидеть, что тогда все работаеткак и ожидалось.
Возможно, это не то, что мы ожидаем, но мы должны помнить, что после компиляции разница между обоими типами исключений сводится не более чем к иерархии классов. Поэтому Spring может только проверить, расширяет ли наш класс RuntimeException
или нет. Теоретически это может откатить транзакцию для всех типов исключений, но это имеет свои недостатки. Во-первых, поскольку Spring предоставляет только одну версию двоичных файлов для Java и Kotlin, он должен будет решить, поддерживать ли откат для подклассов RuntimeException
(более распространенный в Java) или для подклассов Exception
(более распространенный в Kotlin). Кроме того, он автоматически откатит транзакцию в случае любого исключения, даже если мы перехватим ее и обработаем сбой внутри транзакции.