MySQL事务机制和隔离级别使用方式

 更新时间:2025年09月23日 08:48:34   作者:我需要打球  
MySQL事务通过ACID特性保障数据一致性,隔离级别(读未提交、读已提交、可重复读、串行化)平衡并发性能与数据安全,InnoDB默认使用可重复读,依赖MVCC避免脏读和不可重复读,间隙锁减少幻读,需根据场景权衡一致性与性能

MySQL 的事务机制是保证数据库操作一致性和可靠性的核心特性,而隔离级别则用于平衡事务并发时的性能数据一致性

以下是详细解析:

一、事务的四大特性(ACID)

事务(Transaction)是一组不可分割的 SQL 操作,要么全部成功,要么全部失败,核心依赖四大特性:

原子性(Atomicity)

  • 事务中的操作要么全部执行,要么全部回滚(如转账时,扣款和收款必须同时成功或失败)。
  • 实现依赖:Undo Log(记录操作前的状态,用于回滚)。

一致性(Consistency)

  • 事务执行前后,数据从一个合法状态转换到另一个合法状态(如转账后总金额不变)。
  • 由原子性、隔离性、持久性共同保证,部分依赖业务逻辑。

隔离性(Isolation)

  • 多个事务并发执行时,彼此的操作互不干扰(如避免同时修改同一行数据导致的混乱)。
  • 实现依赖:锁机制(行锁、表锁)和 MVCC(多版本并发控制)。

持久性(Durability)

  • 事务提交后,修改永久保存(即使数据库崩溃也不丢失)。
  • 实现依赖:Redo Log(记录操作后的状态,用于崩溃恢复)。

二、事务的隔离级别(SQL 标准定义)

MySQL 的隔离级别从低到高分为 4 种,级别越高,并发控制越严格,但性能开销越大

隔离级别脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read)说明
读未提交(Read Uncommitted)可能发生可能发生可能发生一个事务可读取另一个未提交的修改,极少使用(如实时数据监控场景)。
读已提交(Read Committed)不会发生可能发生可能发生一个事务只能读取另一个已提交的修改(Oracle 默认级别)。
可重复读(Repeatable Read)不会发生不会发生几乎不发生事务中多次读取同一数据结果一致(MySQL InnoDB 默认级别)。
串行化(Serializable)不会发生不会发生不会发生事务串行执行,完全避免并发问题,但性能极低(仅用于严格数据一致性场景)。

三、各隔离级别的典型场景与实现

1. 读未提交(Read Uncommitted)

  • 场景:几乎不使用,仅适用于允许临时脏数据的极端场景(如实时统计)。
  • 问题:事务 A 修改数据未提交,事务 B 读取到该 “脏数据”,若 A 回滚,B 读取的是无效数据。

2. 读已提交(Read Committed)

  • 场景:大多数互联网应用(如电商订单查询,允许读取最新已提交数据)。
  • 解决脏读:通过行锁保证,事务 A 修改数据时加锁,事务 B 只能读取 A 提交后的数据。
  • 问题:不可重复读 —— 事务 B 两次读取同一行,期间事务 A 修改并提交,导致 B 两次结果不同。

3. 可重复读(Repeatable Read,MySQL 默认)

  • 场景:金融、支付等需保证多次读取一致性的场景(如对账时多次查询同一订单金额)。
  • 解决不可重复读:通过 MVCC 实现,事务启动时生成数据快照,后续读取基于快照,不受其他事务提交影响。
  • 对幻读的优化:InnoDB 通过 “间隙锁(Gap Lock)”+“临键锁(Next-Key Lock)”,几乎避免幻读(特殊场景仍可能发生,但实际使用中可忽略)。

4. 串行化(Serializable)

  • 场景:数据一致性要求极高的场景(如银行核心交易)。
  • 实现:强制事务按顺序执行(加表级锁),完全禁止并发,性能极低。

四、MySQL 中设置与查看隔离级别

1. 查看当前隔离级别

-- MySQL 8.0+
SELECT @@transaction_isolation;

-- MySQL 5.7及以下
SELECT @@tx_isolation;

2. 设置隔离级别(当前会话或全局)

-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别名称;

-- 设置全局隔离级别(需重新连接生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别名称;

-- 示例:设置当前会话为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

五、事务控制语句

  • 开启事务START TRANSACTION; 或 BEGIN;
  • 提交事务COMMIT;(使修改永久生效)
  • 回滚事务ROLLBACK;(放弃所有修改,恢复到事务开始前状态)
  • 保存点SAVEPOINT 保存点名称;(事务中设置中间点,可回滚到指定点)
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;  -- 设置保存点
UPDATE account SET balance = balance + 100 WHERE id = 2;
ROLLBACK TO sp1;  -- 回滚到保存点(仅撤销第二条更新)
COMMIT;

六、面试核心考点

  1. 默认隔离级别:MySQL InnoDB 默认是可重复读(Repeatable Read),这是与其他数据库(如 Oracle 默认读已提交)的重要区别。
  2. MVCC 与隔离级别的关系:MVCC 是实现可重复读和读已提交的核心机制,通过数据多版本快照避免加锁阻塞。
  3. 隔离级别与性能权衡:级别越高,一致性越好,但并发性能越差,实际应用中通常选择读已提交可重复读
  4. 幻读的处理:InnoDB 在可重复读级别通过间隙锁减少幻读,而串行化级别完全避免幻读。

理解事务机制和隔离级别,是设计高并发、高可靠数据库应用的基础,尤其在金融、电商等对数据一致性要求严格的场景中至关重要。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql 8.0.16 winx64及Linux修改root用户密码 的方法

    mysql 8.0.16 winx64及Linux修改root用户密码 的方法

    这篇文章主要介绍了mysql 8.0.16 winx64及Linux修改root用户密码 的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • MySQL xtrabackup 物理备份原理解析

    MySQL xtrabackup 物理备份原理解析

    xtrabackup 是percona公司开源的MySQL innodb物理备份工具,支持在线热备(备份时不影响数据读写),在工具在业内生产上被大量使用,本次使用xtrabackup 备份的日志和数据库general 日志来对备份的流程和原理进行解读,需要的朋友可以参考下
    2022-12-12
  • Mysql Binlog数据查看的方法详解

    Mysql Binlog数据查看的方法详解

    这篇文章主要介绍了Mysql Binlog数据查看的方法详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • MySql关于null的函数使用分享

    MySql关于null的函数使用分享

    这篇文章主要介绍了MySql中null的函数使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 一文详解如何基于mysql dump进行全量备份还原

    一文详解如何基于mysql dump进行全量备份还原

    在数据库管理中,数据备份和恢复是非常重要的环节,​​mysqldump​​ 是 MySQL 提供的一个非常强大的命令行工具,下面小编就和大家详细介绍一下吧
    2025-10-10
  • MySql各种查询方式详解

    MySql各种查询方式详解

    如果是做数据分析,MySQL里面最重要、最常用的就是数据查询,数据查询不只是简单查询数据库中存储的数据,还要根据需求对数据进行筛选、聚合,以及确定数据以什么样的格式进行显示。MySQL提供了强大、灵活的语句和函数来实现查询的操作
    2022-07-07
  • MySQL数据库子查询 sub query

    MySQL数据库子查询 sub query

    这篇文章主要介绍了MySQL数据库子查询 sub query,子查询指嵌套查询下层的程序模块,当一个查询是另一个查询的条件的时候,更多相关内容需要的小伙伴可以参考一下下面文章内容介绍
    2022-06-06
  • MySQL 查询速度慢的原因

    MySQL 查询速度慢的原因

    高性能MySQL需要合理的设计查询。如果查询写的很糟糕,即使表结构再合理、索引再合适,也是无法实现高性能的。
    2021-05-05
  • MySql 缓存查询原理与缓存监控和索引监控介绍

    MySql 缓存查询原理与缓存监控和索引监控介绍

    这篇文章主要介绍了MySql 缓存查询原理与缓存监控和索引监控,需要的朋友可以参考下
    2021-07-07
  • Mysql迁移到TiDB双写数据库兜底方案详解

    Mysql迁移到TiDB双写数据库兜底方案详解

    这篇文章主要为大家介绍了Mysql迁移到TiDB双写数据库兜底方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论