FeelingLife FeelingLife
首页
  • Go

    • Go基础知识
  • Python

    • Python进阶
  • 操作系统
  • 计算机网络
  • MySQL
  • 学习笔记
  • 常用到的算法
  • Docker
  • Kubernetes
  • Observability
  • 容器底层
其他技术
  • 友情链接
  • 收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xuqil

一介帆夫
首页
  • Go

    • Go基础知识
  • Python

    • Python进阶
  • 操作系统
  • 计算机网络
  • MySQL
  • 学习笔记
  • 常用到的算法
  • Docker
  • Kubernetes
  • Observability
  • 容器底层
其他技术
  • 友情链接
  • 收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 环境搭建

  • 事务

    • 事务隔离性和隔离级别
      • ACID
      • ACID 靠什么保证
      • 幻读,脏读,不可重复读
      • 隔离级别
      • 参考
    • MySQL MVCC
  • 数据库优化

  • 日志

  • 《探下MySQL》
  • 事务
xuqil
2023-03-31
目录

事务隔离性和隔离级别

# 事务隔离性和隔离级别

数据库事务

# ACID

事务的四大特性:

  • 原子性(Atomicity):事务作为⼀个整体被执⾏,包含在其中的对数据库的操作要么全部被执⾏,要么都不执⾏。

  • 一致性(Consistency):指在事务开始之前和事务结束以后,数据不会被破坏,假如 A 账户给 B 账户转 10 块钱,不管成功与否,A 和 B 的总⾦额是不变的。

  • 隔离性(Isolation):多个事务并发访问时,事务之间是相互隔离的,即⼀个事务不影响其它事务运⾏

    效果。

  • 持久性(Durability):表⽰事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

# ACID 靠什么保证

  • 隔离性:通过数据库锁的机制实现。
  • 一致性:由 undo log 来保证。undo log 是回滚日志,记录了事务的 insert、update、delete 操作,回滚的时候做相反的 delete、update、insert 操作来恢复数据。
  • 原子性和持久性:由 redo log 来保证。redo log 重做日志是物理日志,事务提交的时候,必须先将事务的所有日志写入 redo log 持久性,到事务的提交操作才算完成。

# 幻读,脏读,不可重复读

  • 脏读:事务 A、B 交替执⾏,事务 A 读取到事务 B 未提交的数据
  • 不可重复读:在⼀个事务范围内,两个相同的查询,读取同⼀条记录,却返回了不同的数据,这就是不可重复读
  • 幻读:事务 A 查询⼀个范围的结果集,另⼀个并发事务 B 往这个范围中插⼊ / 删除了数据,并静悄悄地提交,然后事务 A 再次查询相同的范围,两次读取得到的结果集不⼀样了,这就是幻读。

# 隔离级别

  • 未提交读(Read Uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。
  • 以提交读(Read Committed):一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读(Repeatable Read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 序列化(Serializable):顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

隔离得越严实,效率就会越低。不同隔离级别对应会产生的问题:

隔离级别 脏读 不可重复读 幻读 加锁读
未提交读(Read Uncommitted) Yes Yes Yes No
已提交读(Read Committed) No Yes Yes No
可重复读(Repeatable Read) No No Yes(InnoDB 除外) No
序列化/串行(Serializable) No No No Yes
  • 获取当前事务隔离级别,默认是 RR (可重复读)

    # 默认是 REPEATABLE-READ
    SHOW VARIABLES LIKE 'transaction_isolation';
    
    1
    2
  • 设置当前会话事务隔离级别

    # 设置为“读未提交”
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    # 设置为“读已提交”
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    # 设置为“可重复读”
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    # 设置为“序列化”
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    1
    2
    3
    4
    5
    6
    7
    8

# 参考

  • 官方文档-InnoDB 宣称使用临键锁解决幻读 (opens new window)
  • 官方文档-InnoDB 临键锁工作在 RR 下 (opens new window)
  • 官方文档-InnoDB 可设置隔离级别为 RC 以关闭 Gap lock (opens new window)
  • 官方文档-InnoDB 临键锁工作在 RR 下 (opens new window)
  • 官方文档-设置事务隔离级别 (opens new window)
上次更新: 2024/05/29, 06:25:22
MySQL 容器形式搭建
MySQL MVCC

← MySQL 容器形式搭建 MySQL MVCC→

最近更新
01
VXLAN互通实验
05-13
02
VXLAN
05-13
03
VLAN
05-13
更多文章>
Theme by Vdoing | Copyright © 2018-2025 FeelingLife | 粤ICP备2022093535号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式