@Transactional执行失败抛异常
时间: 2023-08-19 19:17:19 浏览: 194
TransactionScope出错
当使用@Transactional注解时,如果方法执行失败并抛出异常,事务将会回滚。然而,有几种情况下@Transactional可能无法正常工作。
首先,根据默认配置,Spring只会在抛出的异常为运行时异常(RuntimeException)或错误(Error)时才回滚事务。对于受检异常(checked exception),事务不会回滚。如果希望对特定的异常进行回滚,可以使用@Transactional(rollbackFor = Exception.class)来配置回滚的异常类型。\[1\]
其次,如果一个方法内部调用了另一个没有加事务注解的方法,那么被调用方法的事务将失效,即使被调用方法内部发生了异常。这是因为事务的传播机制导致的。如果希望被调用方法的事务生效,可以在被调用方法上也加上@Transactional注解。\[2\]
另外,多线程下的事务管理也需要注意。由于线程不属于Spring托管,因此默认情况下线程无法使用Spring的事务管理,也无法获取Spring注入的bean。在使用了@Transactional的方法内部开启多线程,多线程内的方法将不受事务控制。如果在多线程中调用的方法发生异常,不会回滚线程中调用方法的事务。\[2\]
综上所述,如果@Transactional执行失败并抛出异常,可能是由于异常类型不符合回滚条件,或者被调用方法没有加事务注解,或者涉及到多线程操作。需要根据具体情况进行排查和调整。\[1\]\[2\]\[3\]
#### 引用[.reference_title]
- *1* *2* *3* [@Transactional(rollbackFor Exception.class)发生SQLException异常不生效的问题](https://blog.csdn.net/dreaminngkong/article/details/126657297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文