如果二者隔离级别不一致,以哪个为主。例如@Transactional 隔离级别是RC,mysql是RR

devtools/2025/2/27 16:40:56/

如果 Spring 的 @Transactional 隔离级别 和 数据库的隔离级别 不一致,最终生效的隔离级别取决于以下两种情况:


1. Spring 隔离级别优先级更高

  • Spring 的行为

    • 当你在 @Transactional 注解中显式配置了隔离级别(例如 isolation = Isolation.READ_COMMITTED),Spring 会在开启事务时向数据库发送 SET TRANSACTION ISOLATION LEVEL <级别> 的指令。

    • 例如:

      sql

      复制

      SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    • 这样会覆盖数据库的默认隔离级别。

  • 生效的隔离级别

    • 以 Spring 配置的隔离级别为准。

    • 例如,@Transactional(isolation = Isolation.READ_COMMITTED) 会强制将事务的隔离级别设置为 READ COMMITTED,即使数据库的默认隔离级别是 REPEATABLE READ


2. 数据库隔离级别优先级更高

  • 数据库的限制

    • 如果数据库不支持 Spring 配置的隔离级别,数据库会忽略 Spring 的配置,使用数据库的默认隔离级别。

    • 例如:

      • Oracle 不支持 READ UNCOMMITTED 和 REPEATABLE READ

      • 如果 Spring 配置了 isolation = Isolation.READ_UNCOMMITTED,而数据库是 Oracle,Spring 会抛出异常或回退到数据库支持的隔离级别。

  • 生效的隔离级别

    • 数据库支持的隔离级别为准。

    • 例如,如果 Spring 配置了 isolation = Isolation.READ_UNCOMMITTED,而数据库是 MySQL,则生效的隔离级别是 READ UNCOMMITTED;但如果数据库是 Oracle,则会回退到 READ COMMITTED


3. 你的问题:Spring 配置为 RC,MySQL 默认是 RR

  • 情况分析

    • Spring 配置了 @Transactional(isolation = Isolation.READ_COMMITTED),即 RC

    • MySQL 的默认隔离级别是 REPEATABLE READ,即 RR

  • 最终生效的隔离级别

    • 以 Spring 配置的隔离级别为准,即 READ COMMITTED

    • 因为 MySQL 支持 READ COMMITTED,Spring 会在开启事务时发送 SET TRANSACTION ISOLATION LEVEL READ COMMITTED 的指令,覆盖 MySQL 的默认隔离级别。


4. 验证方法

你可以通过以下方式验证事务的隔离级别是否生效:

(1) 查看当前事务的隔离级别

在 MySQL 中,可以通过以下 SQL 查询当前会话的隔离级别:

sql

复制

SELECT @@tx_isolation; -- MySQL 5.x
SELECT @@transaction_isolation; -- MySQL 8.x
(2) 测试隔离级别的行为
  • 开启两个事务:

    • 事务 A:更新数据但不提交。

    • 事务 B:查询数据。

  • 根据隔离级别的不同,事务 B 的查询结果会有所不同:

    • 如果隔离级别是 READ COMMITTED,事务 B 看不到事务 A 未提交的数据。

    • 如果隔离级别是 READ UNCOMMITTED,事务 B 可以看到事务 A 未提交的数据。


5. 代码示例

以下是一个 Spring 配置 READ COMMITTED 隔离级别的示例:

java

复制

@Service
public class OrderService {@Autowiredprivate OrderRepository orderRepository;// 使用 READ COMMITTED 隔离级别@Transactional(isolation = Isolation.READ_COMMITTED)public void updateOrder(Order order) {orderRepository.save(order);}// 查询方法@Transactional(isolation = Isolation.READ_COMMITTED)public Order getOrder(Long orderId) {return orderRepository.findById(orderId).orElse(null);}
}

6. 总结

  • Spring 配置的隔离级别优先级更高

    • 如果 Spring 显式配置了隔离级别,且数据库支持该级别,则以 Spring 配置为准。

    • 例如,Spring 配置 READ COMMITTED,MySQL 默认是 REPEATABLE READ,最终生效的是 READ COMMITTED

  • 数据库的限制

    • 如果数据库不支持 Spring 配置的隔离级别,则以数据库支持的隔离级别为准。

  • 验证方法

    • 可以通过 SQL 查询或测试事务行为来验证隔离级别是否生效。

如果你有更多问题,欢迎继续讨论!

@Transactional(readOnly = true)什么含义


http://www.ppmy.cn/devtools/163111.html

相关文章

排序模板——C++

0.排序模板题目 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 …

MySQL表转移数据的三种方式

说明&#xff1a;在一些情况&#xff0c;像大表修改表结构&#xff0c;重新建立分区&#xff08;对已有表建立分区&#xff0c;对历史数据是不生效的&#xff09;&#xff0c;或者表备份&#xff0c;我们需要将表的数据&#xff0c;从一张表转移到另外一张表里。本文介绍&#…

计算机毕设-基于springboot的仁和机构的体检预约系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

pyrender 自动计算相机 pose

目录 计算smpl高和宽 pyrender 自动计算相机 pose 题目: 计算smpl高和宽 import numpy as np# 假设 vertices 是 (N, 3) 的数组 x = vertices[:, 0] # x 坐标 y = vertices[:, 1] # y 坐标# 计算宽度和高度 width = np.max(x) - np.min(x) height = np.max(y) - np.min(…

CentOS修改yum源

1备份官方yum源 进入该目录cd /etc/yum.repos.d/ 查看该目录下的文件 CentOS-Base.repo为系统自带的yum源&#xff0c;确定后将其备份 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2下载阿里云源配置并覆盖原文件 1、安装wget yum ins…

PwnLab详细解答

一、主机发现 arp-scan -l靶机ip&#xff1a;192.168.55.153 二、端口识别、目录枚举、指纹识别 2.1端口识别 nmap -p- 192.168.55.1532.2目录枚举 dirb http://192.168.55.153枚举出来的敏感目录找到了文件上传网站和上传的地址 2.3指纹识别 nmap 192.168.55.153 -sV -…

JavaWeb后端基础(1)

我直接从后端开始做笔记&#xff0c;前面的HTML、CSS、JS、Vue、Ajax先跳过&#xff0c;直接从maven开始 我只是简单的记录大致 帮助回想 不适合进行学习 Maven Maven的作用&#xff1a;依赖管理、项目构建、统一项目结构 依赖管理&#xff1a;方便快捷的管理项目依赖的资…

DeepSeek 与网络安全:AI 在网络安全领域的应用与挑战

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在当今数字化时代&#xff0c;网络安全已成为国家、企业和个人面临的重要挑战。从传统的病毒、木马攻击&#xff0c;到高…