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

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

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

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

相关推荐
paopaokaka_luck几秒前
智能推荐社交分享小程序(websocket即时通讯、协同过滤算法、时间衰减因子模型、热度得分算法)
数据库·vue.js·spring boot·后端·websocket·小程序
留不住丨晚霞8 分钟前
说说SpringBoot常用的注解?
java·开发语言
华科云商xiao徐14 分钟前
Java多线程爬虫动态线程管理实现
java·爬虫·数据挖掘
柒七爱吃麻辣烫23 分钟前
八股文系列-----SpringBoot自动配置的流程
java·spring boot·rpc
M1A128 分钟前
Java 面试系列第一弹:基础问题大盘点
java·后端·mysql
He.ZaoCha28 分钟前
函数-1-字符串函数
数据库·sql·mysql
发仔12328 分钟前
Dubbo介绍及示例用法
java·dubbo
goxingman36 分钟前
关于使用idea打包的时候报错,Maven提示乱码java: �Ҳ�������
java·maven·intellij-idea
二当家的素材网36 分钟前
Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
linux·数据库·centos
白仑色43 分钟前
Oracle 存储过程、函数与触发器
数据库·oracle·数据库开发·存储过程·plsql编程