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

Spring 中的 事务 隔离级别以及传播行为

1. 事务隔离级别(Isolation Level)

事务隔离级别定义了事务在并发环境下的行为,主要解决以下问题:

脏读(Dirty Read):一个事务读取了另一个未提交事务的数据。
不可重复读(Non-Repeatable Read):一个事务在多次读取同一数据时,结果不一致。
幻读(Phantom Read):一个事务在多次查询时,结果集不一致(新增或删除了数据)。

Spring 支持以下五种隔离级别:

DEFAULT:

使用底层数据库的默认隔离级别。

通常是 READ_COMMITTED。

READ_UNCOMMITTED:

最低的隔离级别,允许脏读、不可重复读和幻读。

适用于对数据一致性要求不高的场景。

READ_COMMITTED:

防止脏读,但允许不可重复读和幻读。

大多数数据库的默认隔离级别。

REPEATABLE_READ:

防止脏读和不可重复读,但允许幻读。

适用于需要保证同一事务中多次读取数据一致的场景。

SERIALIZABLE:

最高的隔离级别,防止脏读、不可重复读和幻读。

通过完全锁定数据来实现,性能最差,适用于对数据一致性要求极高的场景。

在 Spring 中,可以通过 @Transactional 注解的 isolation 属性来设置隔离级别:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {// 业务逻辑
}

2. 事务传播行为(Propagation Behavior)

事务传播行为定义了事务方法在调用其他事务方法时的行为。Spring 提供了七种传播行为:

REQUIRED(默认):

如果当前存在事务,则加入该事务;如果不存在,则创建一个新事务。

适用于大多数场景。

REQUIRES_NEW:

总是创建一个新事务,如果当前存在事务,则挂起当前事务。

适用于需要独立事务的场景。

SUPPORTS:

如果当前存在事务,则加入该事务;如果不存在,则以非事务方式执行。

适用于不需要强制事务的场景。

NOT_SUPPORTED:

以非事务方式执行,如果当前存在事务,则挂起当前事务。

适用于不需要事务支持的场景。

MANDATORY:

如果当前存在事务,则加入该事务;如果不存在,则抛出异常。

适用于必须在一个已有事务中执行的场景。

NEVER:

以非事务方式执行,如果当前存在事务,则抛出异常。

适用于绝对不能有事务的场景。

NESTED:

如果当前存在事务,则在嵌套事务中执行;如果不存在,则创建一个新事务。

嵌套事务可以独立提交或回滚,但外部事务回滚时,嵌套事务也会回滚。

在 Spring 中,可以通过 @Transactional 注解的 propagation 属性来设置传播行为:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethod() {// 业务逻辑
}

3. 总结

隔离级别:控制事务在并发环境下的数据可见性,解决脏读、不可重复读和幻读问题。

传播行为:控制事务方法之间的调用行为,决定事务的创建、加入或挂起。

通过合理配置隔离级别和传播行为,可以确保应用程序在并发环境下保持数据的一致性和完整性。

http://www.lryc.cn/news/533550.html

相关文章:

  • 为多个GitHub账户配置SSH密钥
  • OSPF基础(3):区域划分
  • android studio无痛入门
  • 免费windows pdf编辑工具Epdf
  • CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战
  • LeetCode 128: 最长连续序列
  • 大语言模型需要的可观测性数据的关联方式
  • 【韩顺平linux】部分上课笔记整理
  • python调用pc的语音借口
  • 【Golang学习之旅】Golang 内存管理与 GC 机制详解
  • Kamailio 各个功能的共同点、不同点及应用场景
  • Linux(CentOS)安装 Nginx
  • string 与 wstring 的字符编码
  • C#面试常考随笔14: 方法如何传递不定数量的参数?params关键字怎么使用?
  • 开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。
  • VMware下Linux和macOS安装VSCode一些总结
  • aspectFill(填充目标区域的同时保持图像的原有宽高比 (aspect ratio)图像不会被拉伸或压缩变形
  • 我的年度写作计划
  • DeepSeek与llama本地部署(含WebUI)
  • SOA(面向服务架构)全面解析
  • PyQt6/PySide6 的 QDialog 类
  • mes系统对工业数字化转型起到重要作用,它的实际应用有哪些
  • Qt:项目文件解析
  • 【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)
  • Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)
  • WEB攻防-文件下载文件读取文件删除目录遍历目录穿越
  • 部署open webui 调用ollama启动的deepseek
  • 理解推理型大语言模型
  • 告别人工检测!casaim自动化三维激光扫描
  • 使用云效解决docker官方镜像拉取不到的问题