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. 总结

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

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

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

相关推荐
抓蛙师5 分钟前
多租户 tenant_id SQL 注入漏洞分析与应急响应报告
数据库·sql
ACP广源盛139246256739 分钟前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 私有化部署下 GSV2221 视频转换芯片机遇分析
大数据·数据库·人工智能
七牛开发者1 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j
Aphelios3802 小时前
一次锁内网络IO引发的Tomcat线程池“饿死”事故
java·开发语言·spring boot·elasticsearch·tomcat·网络io阻塞·线程池耗尽
不可求~2 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++
Lam Tang2 小时前
APS 系列文章10
java·代理模式
考虑考虑3 小时前
Excel导入时产生特殊字符处理
java·后端·java ee
何以解忧,唯有..3 小时前
数据库索引失效的常见情况与优化策略
数据库·sql·oracle
Scabbards_3 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
晚染烟3 小时前
每日八股day25
spring