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

news/2025/2/24 15:20:31

如果 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 {

    @Autowired
    private 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.niftyadmin.cn/n/5864516.html

相关文章

微信小程序 - 页面跳转(wx.navigateTo、wx.redirectTo、wx.switchTab、wx.reLaunch)

API 跳转 1、wx.navigateTo &#xff08;1&#xff09;基本介绍 功能&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用该方法跳转后可以通过返回按钮返回到原页面 使用场景&#xff1a;适用于需要保留当前页面状态&#xff0c;后续还需返回的情…

无人机+DeepSeek:放飞自我的智能化技术详解!

无人机与DeepSeek的结合代表了智能化技术在低空经济领域的重要应用和发展方向。以下是对这一智能化技术的详细解析&#xff1a; 一、DeepSeek技术概述 DeepSeek是一种基于深度学习和数据挖掘技术的智能搜索与分析系统。它通过深度学习模型理解数据的上下文语义&#xff0c;实…

编程小白冲Kaggle每日打卡(13)--kaggle学堂:<机器学习简介>基础数据探索

Kaggle官方课程链接&#xff1a;Basic Data Exploration 本专栏旨在Kaggle官方课程的汉化&#xff0c;让大家更方便地看懂。 Basic Data Exploration 加载并理解您的数据。 使用Pandas熟悉您的数据 任何机器学习项目的第一步都是熟悉数据。您将使用Pandas库进行此操作。Pand…

IDEA使用Maven方式构建SpringBoot项目

1、环境准备 确保你已经安装了以下工具&#xff1a; Java JDK&#xff08;推荐 JDK 8 或更高版本&#xff09; IntelliJ IDEA&#xff08;推荐使用最新版本&#xff09; 2、创建 Spring Boot 项目 &#xff08;1&#xff09; 打开 IntelliJ IDEA。 &#xff08;2&#xff09…

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/&#xff0c;登录个人账号&#xff0c;右上角加号…

綫性與非綫性泛函分析與應用_2.賦范向量空間-母本

第2章 賦范向量空間 1.向量空間;哈默爾基;向量空間的維數 - 定義與性質 - 向量空間的定義:設\mathbb{K}為數域,集合X是\mathbb{K}上的向量空間,若在X上定義了加法(x,y)\in X\times X\to x + y\in X和數乘(\alpha,x)\in\mathbb{K}\times X\to\alpha x\in X兩種運算,且滿足…

在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)

在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

图神经网络

现在是下午四点&#xff0c;我今天醒的太晚了&#xff0c;十二点才起床&#xff0c;然后打打炉石看看小说&#xff0c;一晃就到现在了。不过真的蛮有意思的。我得开始学习了&#xff0c;毕竟时间很紧张&#xff0c;我需要尽快达到毕业要求。 补充一下&#xff0c;其实喜欢看网文…