Spring事务与事务传播机制教程|从入门到实战,一篇吃透@Transactional
—JavaEE专栏—Spring事务与事务传播机制教程从入门到实战一篇吃透Transactional大家好我是一名后端开发今天带来一篇Spring事务传播机制的硬核实战博客包含原理代码图文面试高频完整实战案例看完彻底搞定Spring事务再也不怕数据不一致 前言为什么要学Spring事务保证原子性要么全成功要么全回滚解决数据一致性转账、下单、注册等核心业务必备面试必问事务隔离级别、传播机制、Transactional失效场景本文基于SpringBoot从基础事务操作 → 编程式/声明式事务 → 隔离级别 →7大传播机制附带8个真实业务事务案例小白也能直接运行复现一、数据库事务基础回顾事务就是一组不可分割的操作遵循ACID原则原子性全部成功 or 全部失败一致性执行前后数据合法隔离性多事务互不干扰持久性提交后永久生效MySQL原生事务操作-- 开启事务STARTTRANSACTION;/BEGIN;-- 业务SQLINSERTINTOuser_info...;-- 提交/回滚COMMIT;ROLLBACK;缺点代码冗余、侵入性强Spring帮我们自动化二、Spring事务两种实现方式Spring提供编程式和声明式两种事务开发中99%用声明式。1. 编程式事务手动控制事务开启、提交、回滚代码繁琐适合特殊场景。核心对象DataSourceTransactionManager事务管理器TransactionDefinition事务属性TransactionStatus事务状态RestControllerRequestMapping(/user)publicclassUserController{AutowiredprivateDataSourceTransactionManagertransactionManager;AutowiredprivateTransactionDefinitiontransactionDefinition;AutowiredprivateUserServiceuserService;RequestMapping(/registry)publicStringregistry(Stringname,Stringpassword){// 1.开启事务TransactionStatusstatustransactionManager.getTransaction(transactionDefinition);try{// 2.执行业务userService.registryUser(name,password);// 3.提交transactionManager.commit(status);return成功;}catch(Exceptione){// 4.异常回滚transactionManager.rollback(status);return失败;}}}2. 声明式事务重点Transactional只需一个注解自动开启、提交、回滚基于AOP实现无侵入性两步使用引入事务依赖SpringBoot已自动集成dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactId/dependency方法/类上添加TransactionalServicepublicclassUserService{AutowiredprivateUserInfoMapperuserInfoMapper;// 声明事务TransactionalpublicvoidregistryUser(Stringname,Stringpassword){userInfoMapper.insert(name,password);}}✨ Transactional 核心规则修饰public方法*才生效方法正常执行自动提交抛出未捕获异常自动回滚异常被捕获→ 不回滚三、Transactional 三大核心属性1. rollbackFor指定回滚异常默认只回滚RuntimeException Error编译期异常如IOException不回滚// 所有异常都回滚推荐配置Transactional(rollbackForException.class)2. isolation事务隔离级别Spring支持5种隔离级别对应MySQL4种默认级别含义解决问题DEFAULT跟随数据库默认-READ_UNCOMMITTED读未提交脏读READ_COMMITTED读已提交脏读REPEATABLE_READ可重复读不可重复读SERIALIZABLE串行化脏读、不可重复读、幻读使用Transactional(isolationIsolation.READ_COMMITTED)3. propagation事务传播机制多个事务方法互相调用时事务如何传递Spring定义7种传播机制重点掌握REQUIRED、REQUIRES_NEW、NESTED【实战必看】8个Spring事务真实案例事务提交、回滚、异常捕获、手动回滚、编译异常回滚等所有高频场景可直接测试的Controller接口完整Controller代码packagecn.overthinker.trans.controller;importcn.overthinker.trans.entity.UserInfo;importcn.overthinker.trans.service.UserService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.transaction.annotation.Isolation;importorg.springframework.transaction.annotation.Transactional;importorg.springframework.transaction.interceptor.TransactionAspectSupport;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.io.IOException;Slf4jRestControllerRequestMapping(/trans)publicclassTransController{AutowiredprivateUserServiceuserService;/** * 1. 正常事务提交无异常 → 数据入库成功 */TransactionalRequestMapping(/registry)publicStringregistryUser(UserInfouserInfo){//用户注册userService.insertUser(userInfo);return用户注册成功事务已提交;}/** * 2. 抛出未捕获异常 → 事务自动回滚 * 结果数据不会插入数据库 */TransactionalRequestMapping(/r2)publicStringr2(UserInfouserInfo){//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);// 主动抛运行时异常inta10/0;return用户注册成功;}/** * 3. 异常被try-catch捕获 → 事务【不会回滚】 * 结果数据成功入库经典坑点 */TransactionalRequestMapping(/r3)publicStringr3(UserInfouserInfo){//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);try{inta10/0;}catch(Exceptione){log.error(程序发生异常被捕获事务不回滚);}return用户注册成功数据已入库;}/** * 4. 捕获异常后重新抛出 → 事务【正常回滚】 * 结果数据不会入库 */TransactionalRequestMapping(/r4)publicStringr4(UserInfouserInfo){//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);try{inta10/0;}catch(Exceptione){log.error(程序发生异常被捕获重新抛出异常);throwe;}return用户注册成功;}/** * 5. 捕获异常 手动回滚 → 事务【回滚】 * 结果数据不会入库接口正常返回 */TransactionalRequestMapping(/r5)publicStringr5(UserInfouserInfo){//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);try{inta10/0;}catch(Exceptione){log.error(程序发生异常被捕获手动回滚事务);// 手动触发事务回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return用户注册失败事务已手动回滚;}/** * 6. 抛出编译期异常(IOException) → 事务【不回滚】 * 默认规则只回滚 RuntimeException/Error */TransactionalRequestMapping(/r6)publicStringr6(UserInfouserInfo)throwsIOException{//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);if(true){// 编译期异常默认不回滚thrownewIOException();}return用户注册成功IO异常未回滚;}/** * 7. 配置 rollbackForException.class → 所有异常都回滚 * 结果IOException 也会触发回滚 */Transactional(rollbackForException.class,isolationIsolation.READ_COMMITTED)RequestMapping(/r7)publicStringr7(UserInfouserInfo)throwsIOException{//用户注册IntegerresultuserService.insertUser(userInfo);log.info(数据插入成功影响行数result);if(true){thrownewIOException();}return用户注册成功IO异常已回滚;}} 案例效果总结接口事务表现核心结论/trans/registry正常提交无异常自动提交/trans/r2自动回滚运行时异常自动回滚/trans/r3不回滚异常被catch事务失效大坑/trans/r4自动回滚捕获后重新抛出生效/trans/r5手动回滚手动控制事务灵活安全/trans/r6不回滚默认不回滚编译期异常/trans/r7自动回滚配置rollbackFor后全异常回滚⚠️ Transactional 常见失效场景非public方法→ 不生效异常被try-catch吃掉→ 不回滚未指定rollbackFor→ 编译异常不回滚同类方法内部调用→ AOP不生效数据库引擎不支持事务如MyISAM四、7大事务传播机制详解图文代码先统一场景用户注册 记录日志两个带事务的方法互相调用。1. REQUIRED默认值 ✅ 最常用有事务加入无事务新建Transactional(propagationPropagation.REQUIRED)内外共用同一个事务一方异常 →全部回滚适用常规业务增删改演示日志方法抛异常 → 用户数据也回滚2. REQUIRES_NEW独立事务 ✅ 高频无论如何都新建事务挂起外层事务Transactional(propagationPropagation.REQUIRES_NEW)内外完全独立日志异常 → 不影响用户注册适用日志、审计、消息发送必须独立成功演示日志失败 → 用户依然注册成功3. NESTED嵌套事务 ✅ 高级有事务则嵌套Savepoint无则同REQUIREDTransactional(propagationPropagation.NESTED)子事务可单独回滚不影响父事务父事务回滚 → 子事务必回滚依赖数据库Savepoint4. SUPPORTS有事务就加无事务非事务运行适用查询操作5. MANDATORY必须有事务无事务直接抛异常适用强制运行在事务内的核心逻辑6. NOT_SUPPORTED非事务运行有事务也挂起适用不需要事务的操作7. NEVER禁止事务有事务抛异常适用明确不能在事务中运行的方法 传播机制核心对比表类型外层有事务外层无事务核心特点场景REQUIRED加入新建共用事务通用业务REQUIRES_NEW新建并挂起新建独立事务日志NESTED嵌套子事务新建局部回滚复杂批量SUPPORTS加入非事务灵活查询MANDATORY加入抛异常强制事务核心逻辑NOT_SUPPORTED挂起非事务无事务非核心操作NEVER抛异常非事务禁止事务安全方法七、总结Spring事务编程式手动声明式Transactional三大属性rollbackFor、isolation、propagation7大传播机制重点REQUIRED、REQUIRES_NEW、NESTED实战8大案例覆盖所有事务坑点直接复制测试开发规范增删改用REQUIRED日志用REQUIRES_NEW
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2507760.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!