Spring中事务失效的场景有哪些
异常捕获处理,抛出检查异常和非public方法。
异常捕获处理
原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。
解决:在catch块添加throw new RuntimeException(e)手动抛出。
抛出检查异常
原因:Spring 默认只会回滚非检查异常。
解决:配置rollbackFor属性,@Transactional(rollbackFor=Exception.class)
。
非public方法
原因:Spring 为方法创建代理、添加事务通知、前提条件都是该方法是public的。
解决:改为public方法。