MySQL InnoDB【事务模型】之【事务隔离级别】 全攻略

事务隔离级别

事务隔离是数据库处理的基础之一。隔离是缩写ACID中的I;当多个事务同时进行更改和查询时,隔离级别是微调性能与可靠性、一致性和结果再现性之间平衡的设置。

InnoDB提供SQL:1992标准描述的所有四种事务隔离级别: READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

InnoDB 的默认隔离级别是 REPEATABLE READ

用户可以使用 SET TRANSACTION 语句更改单个会话或所有后续连接的隔离级别。

要为所有连接设置服务器的默认隔离级别,可以在命令行或选项文件中使用 --transaction-isolation 选项。

InnoDB使用不同的锁定策略支持这里描述的每一种事务隔离级别。

  • 你可以使用默认的REPEATABLE READ级别来执行高度的一致性,用于对ACID合规性非常重要的关键数据的操作。

  • 在批量报告等情况下,精确的一致性和结果的可重复性没有最大限度减少锁定开销那么重要,这时可以使用 READ COMMITTED 或甚至 READ UNCOMMITTED 放宽一致性规则。

  • SERIALIZABLE 执行比 REPEATABLE READ 更严格的规则,主要用于特殊情况,如 XA 事务以及并发和死锁问题的故障诊断。

下面的列表描述了 MySQL 如何支持不同的事务级别。该列表从最常用的级别到最不常用的级别依次排列。

可重复读(REPEATABLE READ)

这是 InnoDB 的默认隔离级别。同一事务中的一致读取会读取第一次读取建立的快照。这意味着,如果在同一事务中发出多条普通(非锁定)SELECT 语句,这些 SELECT 语句之间也是一致的。

对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 和 DELETE 语句,锁定取决于语句是使用带有唯一搜索条件的唯一索引,还是使用范围类型的搜索条件。

  • 对于具有唯一搜索条件的唯一索引,InnoDB 只锁定找到的索引记录,而不锁定之前的空白。
  • 对于其他搜索条件,InnoDB 会锁定所扫描的索引范围,使用间隙锁或下一键锁来阻止其他会话插入该范围所覆盖的间隙。

读提交内容(READ COMMITTED)

即使在同一个事务中,每次一致读取都会设置并读取自己的新快照。

对于锁定读取(带有 FOR UPDATE 或 FOR SHARE 的 SELECT)、UPDATE 语句和 DELETE 语句,InnoDB 只锁定索引记录,而不锁定它们之前的间隙,因此允许在锁定记录旁边自由插入新记录。间隙锁定仅用于外键约束检查和重复键检查。

由于间隙锁定被禁用,可能会出现幽灵行问题,因为其他会话可以在间隙中插入新记录。

READ COMMITTED 隔离级别仅支持基于行的二进制日志记录。如果使用带有 binlog\_format=MIXEDREAD COMMITTED,服务器会自动使用基于行的日志记录。

使用 READ COMMITTED 还会产生其他影响:

  • 对于 UPDATE 或 DELETE 语句,InnoDB 只为其更新或删除的记录加锁。非匹配记录的记录锁会在MySQL评估完WHERE条件后释放。这大大降低了死锁发生的概率,但死锁仍有可能发生。

  • 对于UPDATE语句,如果记录已经被锁定,InnoDB会执行 "半一致 "读取,向MySQL返回最新提交的版本,以便MySQL确定记录是否与UPDATE的WHERE条件相匹配。如果符合(必须更新

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder.Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值