@Transactional使用try->catch捕获异常并回滚方法
需求:需要捕获到@Transactional中的异常,并不影响事物回滚
1 2 3 4 5 6 7 8 9 | @Transactional (rollbackFor = Exception. class ) public void test() { try { updata(); updata2(); } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //如果updata2()抛了异常,updata()会回滚,不影响事物正常执行 } |
spring 的默认事务机制,当出现unchecked异常时候回滚,checked异常的时候不会回滚;
异常中unchecked异常包括error和runtime异常,需要try catch或向上抛出的异常为checked异常比如IOException,也就是说程序抛出runtime异常的时候才会进行回滚,其他异常不回滚,可以配置设置所有异常回滚:
@Transactional(rollbackFor = { Exception.class })
当有try catch后捕获了异常,事务不会回滚,如果不得不在service层写try catch 需要catch后 throw new RuntimeException 让事务回滚;
Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对R untimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚, “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” ,要想捕获非运行时异常则需要如下配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构