引发异常的@Transactional方法的默认行为已得到广泛讨论(例如,参见search results here),并且在Javadoc of org.springframework.transaction.interceptor.DefaultTransactionAttribute中有明确记录。本质上,运行时异常和错误会导致回滚,但检查的异常不会。
但是,随着Kotlin的使用增加,我认为相当灾难性的问题越来越多地蔓延到代码未意识到的危险中,我想知道是否应该考虑更改DefaultTransactionAttribute的行为以使其与行为保持一致。 TransactionTemplate,它会回退已检查的异常。
我发现的问题在于一段代码,其中@Transactional Kotlin方法间接调用了一个Java方法,该方法声明了一个已检查的异常-这种异常实际上很少发生。
导致Java方法的Kotlin方法调用链在任何时候都没有捕获并处理已检查的异常,当然编译器对此非常满意。毫无疑问,代码的编写者或审阅者应该已经发现了遗漏,但是实际上,这是很容易被忽略的问题。如果错过了,结果的确是很糟糕的-在我的情况下,即使只有一半的预期实体已被创建,但事务已被提交,事务才被提交,并且实际异常在TransactionAspectSupport中被吞没,因此在任何地方都不可见。我只是发现了问题,因为(幸运的是)在随后的代码中违反了完整性约束。
这种情况是否会产生足够高的影响,以至于框架代码应保护开发人员免受自身侵害?在Java中,很难偶然出错,但在Kotlin中则是另一回事。