当前位置: 首页 > news >正文

Spring学习-事务

一、数据库事务的基本特性

1.事物的基本特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

2.事务的隔离级别

隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读已提交 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能
  • 脏读:在一个事务中读取到了其它事务未提交的数据
  • 不可重复读:在一个事务中,两次读取结果不一样
  • 幻读: 先判断身份证号是否存在再插入数据的情况,在高并发下会出现同时插入两条相同的身份证号

二、Spring 对事务的支持与适用

1.Spring 事务相关API说明

spring 事务是在数据库事务的基础上进行封装拓展

  • 支持原有的事务隔离级别
  • 加入了事务传播的概念,提供多个事务的合并或隔离的功能
  • 提供声明式事务,让业务代码与事务分离,事务变得更易用

spring 提供了三个接口供事务使用

  • TransactionDefinition:事务定义
  • PlatformTransactionManager: 事务管理
  • TransactionStatus: 事务运行时状态

2.声明式事务

@Transactional

3.事务的传播机制

类别 事务传播类型 说明
支持当前事务 PROPAGATION_REQUIRED(必须的) 如果当前没有事务,就新建一个事务,如果已经存在一个事务,加入到这个事务中。
支持当前事务 PROPAGATION_SUPPORT(支持) 支持当前事务,如果当前没有事务,就以非事务方式执行
支持当前事务 PROPAGATION_MANDATORY(强制) 使用当前的事务,如果当前没有事务就抛出异常
不支持当前事务 PROPAGATION_REQUIRED_NEW(隔离) 新建事务,如果当前存在事务,把当前事务挂起
不支持当前事务 PROPAGATION_NOT_SUPPORTED(不支持) 以非事务方式进行操作,如果当前存在事务,就把当前事务挂起
不支持当前事务 PROPAGATION_NEVER(强制非事务) 以非事务方式执行,如果当前存在事务,则抛出异常
套事务 PROPAGATION_NESTED(强制非事务) 以非事务方式执行,如果当前存在事务,则抛出异常

常用事务传播机制

  • PROPAGATION_REQUIRED:这个也是默认的事务传播机制
  • PROPAGATION_NOT_SUPPORTED:可以用于发送提示消息、站内信、短信、邮件提示等。不属于并且不应当影响主体业务逻辑,即使发送失败也不应该对主体业务逻辑回滚
  • PROPAGATION_REQUIRED_NEW:总是新启一个事务,这个传播机制适用于不受父方法事务影响的操作,比如某个业务场景下需要记录业务日志,用于异步反查,那么不管主体业务逻辑是否完成,日志都需要记录下来,不能因为主体业务逻辑报错而丢失日志

案例一

创建用户时初始化一个账户,表结构和服务类如下

表结构 服务类 功能描述
user UserServcie 创建用户,并添加账户
account AccountService 添加账户

UserService.createUser(name)伪代码

 @Transactionalpublic void createUser(String name) {// 新增用户基本信息jdbcTemplate.update("insert into `user` (name) values(?)", name);// 调用accountService添加账户acccoutService.addAccount(name, 10000);
}

acccoutService.addAccount(name,initMoney)

@Transactional(propagation = Propagation.REQUIRED)
public void addAccount(String name, int initMoney) {String accountId = String.valueOf(System.currentTimeMillis());jdbcTemplate.update("insert into `account` (account_name,user,money) values(?, ?, ?)", accountId, name, initMoney);// 分母为0异常int i = 1 / 0;
}

预测

createUser addAccount 结果
场景一 无事务 required(假定有异常) user添加成功,account添加失败
场景二 required 无事务(假定有异常) user添加失败,account添加失败(addAccount无事务,使用createUser的事务)
场景三 required not_supported(假定有异常) user添加是失败,account添加成功(addAccount事务挂起添加成功,存在报错影响createUser,故user添加失败)
场景四 required required_new(假定有异常) user添加失败,account添加失败
场景五 required(假定有异常) required_new user添加失败,account添加成功(account 独立事务添加成功)

三、aop 事务底层实现原理

spring 声明式事务使用动态代理实现,当调用同一个类的方法时,是不会走代理逻辑的,因此事务会失效

// TransactionInterceptor 核心逻辑
public Object invoke(MethodInvocation invocation) throws Throwable {// 1. 获取事务属性(@Transactional 配置)TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);// 2. 获取 PlatformTransactionManagerPlatformTransactionManager tm = getTransactionManager(txAttr);// 3. 创建事务信息TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);try {// 4. 执行目标方法Object retVal = invocation.proceed();// 5. 提交事务commitTransactionAfterReturning(txInfo);return retVal;} catch (Throwable ex) {// 6. 异常回滚completeTransactionAfterThrowing(txInfo, ex);throw ex;} finally {// 7. 清理事务信息cleanupTransactionInfo(txInfo);}
}
http://www.jsqmd.com/news/844119/

相关文章:

  • PWM
  • 户外亮化照明工程公司怎么选,镇江市亮化工程公司哪家好? - 博客万
  • SAP-ABAP:数据类型与数据对象 第一篇:基础概念篇——数据类型与数据对象的核心差异辨析
  • 病理WSI分析入门:手把手教你用CLAM处理Camelyon16数据(附Ubuntu20.04依赖修复)
  • Real World Rails安全指南:从100个真实项目中学习Rails应用的安全最佳实践
  • 从UWB有源布设到纯视觉无感,智慧定位技术迭代升级
  • Unity InputSystem组合键实战:解决Shift+1误触数字1的完整方案(附代码)
  • 给Code Agent加约束:从AGENTS.md开始
  • 高端定制旅游找哪家?2026 四川靠谱定制旅行社最新排名,专业靠谱推荐 - 深度智识库
  • 3个方法彻底告别Windows自动休眠:NoSleep防休眠工具完全指南
  • ClassiCube高级渲染技巧:环境渲染、选择框渲染和粒子系统的实现原理
  • 户外亮化照明工程公司怎么选,盐城市亮化工程公司哪家好? - 博客万
  • 终极免费开源方案:高效解决网页图片格式转换难题的完整指南
  • 你知道支付宝立减金的使用范围和回收价值吗?答案都在这里! - 团团收购物卡回收
  • 7.1、传输层的可靠数据传输
  • 2026年全屋定制/家具定制工厂推荐:江西太明科技实业有限公司,松木/橡胶木/桧木/皮革门多材质高定代工 - 品牌推荐官
  • 微信多开电脑版bat命令不执行电脑双开微信的bat代码
  • 点瑞网络:成都GEO公司「专业AI大模型搜索优化」GEO外包服务公司 - 品牌推荐官方
  • 【2026-05-18】自讨难受
  • 通达信数据获取的Python革命:告别复杂配置,3步开启量化分析
  • 大众点评数据采集终极指南:5分钟快速部署实战方案
  • Python-docx处理超链接踩坑实录:从‘查不到’到‘随心改’的完整心路历程
  • 微信多开怎么设置双开微信的bat文件怎么写
  • 2026年贵阳百货批发、不锈钢厨具批发、地摊货源怎么选?云贵川源头供应商深度横评与避坑指南 - 精选优质企业推荐官
  • 户外亮化照明工程公司怎么选,扬州市亮化工程公司哪家好? - 博客万
  • 深层分析C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
  • 高级XP3资源解包工具KrkrzExtract:深度解析krkrz引擎资源管理方案
  • 终极指南:如何在macOS上轻松安装KLayout版图设计软件
  • DeepL翻译文档被锁定了?别急,用记事本+RTF格式5分钟搞定编辑限制
  • 2026年合肥GEO优化服务商3强实力分析与企业选型参考报告 - 产业观察网