Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

    • MySQL8一键安装配置优化
    • MySQL导出CSV格式解决乱码
    • MySQL 角色管理
    • MySQL网络抓包审计
    • MySQL性能压测
    • MySQL配合Consul读写分离
    • Gh-ost重建表,清除表碎片率
    • MySQL MGR配合MySQL-router实现innodb-cluster
    • MySQL 快速分析binlog定位问题
    • MySQL执行计划分析
    • DBA常用SQL和命令整理备查
    • mysqldump实时同步数据
    • MySQL的事务隔离级别
      • 事务的四大特性(ACID)
      • 并发事务可能出现的问题
        • 1. 脏读(Dirty Read)
        • 2. 不可重复读(Non-Repeatable Read)
        • 3. 幻读(Phantom Read)
        • 不可重复读vs幻读的区别
      • MySQL的四种隔离级别
      • 隔离级别的实现原理
      • 如何查看和设置隔离级别
        • 查看当前隔离级别
        • 设置隔离级别
    • MySQL存储过程批量生成数据
    • MySQL insert on duplicate key update,replace into , insert ignore的理解
    • MySQL不同字符集之间的区别和选择
    • MySQL为什么有时候会选错索引
    • MySQL死锁问题
    • MySQL使用SQL语句查重去重
    • MySQLdump逻辑备份
    • MySQL主从跳过异常GITD
    • MySQL8设置slowlog记录所有语句
    • MySQL8快速克隆插件使用指南
    • MySQL8双1设置保障安全
    • MySQL锁
    • innodb cluster安装
    • MySQL里的left join 和right join以及inner join
    • optimize table和 analyze table的区别
    • MySQL 字段的区分度计算公式
    • MySQLReplicaSet 安装
    • 脚本实现MySQL ReplicaSet 高可用
    • MySQL 的Left join,Right join和Inner join 的区别
    • MySQL45讲学习笔记
  • Redis

  • Keydb

  • TiDB

  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • MySQL
Carry の Blog
2022-09-12
目录

MySQL的事务隔离级别

# MySQL的事务隔离级别

MySQL将事务分为不同的隔离级别,主要是为了解决在多事务并发场景下可能出现的数据一致性问题。通过不同级别的事务隔离,可以防止出现脏读、不可重复读和幻读等问题。

# 事务的四大特性(ACID)

  1. 原子性(Atomicity):事务是不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚。

  2. 一致性(Consistency):事务执行前后,数据库必须保持一致性状态。例如:A和B账户共有5000元,不管他们之间如何转账,事务结束后两账户的总金额应该仍然是5000元。

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  4. 持久性(Durability):一个事务一旦提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

# 并发事务可能出现的问题

# 1. 脏读(Dirty Read)

当一个事务读取到另一个事务未提交的数据时,就会发生脏读。

示例:

  • 事务A读取了事务B未提交的数据(余额100修改为200)
  • 事务B随后回滚(余额恢复为100)
  • 事务A使用了错误的数据(认为余额是200)

# 2. 不可重复读(Non-Repeatable Read)

在同一事务内,多次读取同一数据却得到不同的结果。

示例:

  • 事务A第一次读取某行数据
  • 事务B修改该行数据并提交
  • 事务A再次读取该行数据,发现数据已变化

# 3. 幻读(Phantom Read)

在同一事务内,多次查询某个范围的记录,发现记录数量不一致。

示例:

  • 事务A查询工资大于1000的员工数量为10人
  • 事务B插入一条工资为1500的记录并提交
  • 事务A再次查询,发现工资大于1000的员工变为11人

# 不可重复读vs幻读的区别

  • 不可重复读:针对数据**更新(UPDATE)**操作
    • 解决方案:行级锁
  • 幻读:针对数据**插入(INSERT)和删除(DELETE)**操作
    • 解决方案:表级锁或间隙锁

# MySQL的四种隔离级别

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED(读未提交) 可能 可能 可能
READ COMMITTED(读已提交) 不可能 可能 可能
REPEATABLE READ(可重复读) 不可能 不可能 可能
SERIALIZABLE(串行化) 不可能 不可能 不可能

MySQL默认的隔离级别是REPEATABLE READ(可重复读)。

# 隔离级别的实现原理

MySQL通过多版本并发控制(MVCC)和锁机制来实现事务隔离:

  1. MVCC(Multi-Version Concurrency Control):

    • 每次更新操作都会生成一条回滚日志(undo log)
    • 不同时间点启动的事务会创建不同的read-view
    • 通过回滚日志可以找到数据的历史版本
  2. 回滚日志(undo log)管理:

    • 当没有事务需要用到某个回滚日志时,该日志会被删除
    • 系统中不存在比该回滚日志更早的read-view时,日志即可删除

# 如何查看和设置隔离级别

# 查看当前隔离级别

方式1:

SHOW VARIABLES LIKE 'transaction_isolation';
1

方式2:

SELECT @@transaction_isolation;
1

# 设置隔离级别

  1. 通过SET命令:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;

-- level可选值:
-- REPEATABLE READ
-- READ COMMITTED
-- READ UNCOMMITTED
-- SERIALIZABLE
1
2
3
4
5
6
7
  1. 通过启动参数:
--transaction-isolation=REPEATABLE-READ
1

不同作用域说明:

  • GLOBAL:影响后续新的会话
  • SESSION:影响当前会话的后续事务
  • 无关键词:只影响下一个事务
上次更新: 4/24/2025

← mysqldump实时同步数据 MySQL存储过程批量生成数据→

最近更新
01
tidb fast ddl
04-04
02
TiDB配置文件调优 原创
04-03
03
如何移除TiDB中的表分区 原创
04-03
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式