当前位置: 首页 > article >正文

MySQL:事务隔离级别

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交) :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化) :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别脏读不可重复读幻读
READ-UNCOMMITTED(读取未提交)
READ-COMMITTED(读取已提交)×
REPEATABLE-READ(可重复读)××
SERIALIZABLE(可串行化)×××

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

MySQL> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。

但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:

  • 快照读:由 MVCC 机制来保证不出现幻读。
  • 当前读:使用 Next-Key Lock 进行加锁来保证不出现幻读,Next-Key Lock 是行锁(Record Lock)和间隙锁(Gap Lock)的结合,行锁只能锁住已经存在的行,为了避免插入新行,需要依赖间隙锁。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失。

InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE 隔离级别。

《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章这样写到:

InnoDB 存储引擎提供了对 XA 事务的支持,并通过 XA 事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABL.


http://www.kler.cn/a/316817.html

相关文章:

  • 矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现
  • Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
  • 计算机的错误计算(一百五十二)
  • JavaScript数组去重的实用方法汇总
  • 【C++】详细介绍模版进阶,细节满满
  • 【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】
  • Kubernets基础-包管理工具Helm详解
  • 计算机组成原理==初识二进制运算
  • Redisson分布式锁主从一致性问题
  • CentOS修改主机名
  • 【已解决】如何使用JAVA 语言实现二分查找-二分搜索折半查找【算法】手把手学会二分查找【数据结构与算法】
  • 用Qt 对接‌百度AI平台
  • 响应式流规范
  • 胤娲科技:谷歌DeepMind祭出蛋白质设计新AI——癌症治疗迎来曙光
  • DoppelGanger++:面向数据库重放的快速依赖关系图生成
  • JavaScript语法特点
  • linux 使用mdadm 创建raid0 nvme 磁盘
  • 深入理解SpringBoot(一)----SpringBoot的启动流程分析
  • 邮储银行:面向金融行业的移动应用安全风险监测案例
  • 【docker】命令之容器操作
  • C++:布尔类型,引用,堆区空间
  • 力扣232:用栈实现队列
  • 【Proteus仿真】基于51单片机的宠物喂食系统设计
  • JSON合并工具
  • JVM-类加载器的双亲委派模型详解
  • 前后端数据交互 笔记03(get和post方法)