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 属性来设置隔离级别:

java 复制代码
@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {
    // 业务逻辑
}

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

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

REQUIRED(默认):

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

适用于大多数场景。

REQUIRES_NEW:

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

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

SUPPORTS:

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

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

NOT_SUPPORTED:

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

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

MANDATORY:

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

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

NEVER:

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

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

NESTED:

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

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

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

java 复制代码
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void someMethod() {
    // 业务逻辑
}

3. 总结

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

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

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

相关推荐
NE_STOP13 小时前
Vide Coding--AI编程工具的选择
java
码云数智-园园13 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆13 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
小宇宙Zz14 小时前
Maven依赖冲突
java·服务器·maven
swordbob14 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
咖啡八杯14 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网14 小时前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记
摇滚侠14 小时前
IDEA 创建 Java 项目 手动整合 SSM 框架
java·ide·intellij-idea
源分享14 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Flittly14 小时前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring