MySQL8中文手册-事务隔离级别

更多内容请点击MySQL8中文手册

15.7.2.1 事务隔离级别

事务隔离是数据处理工作的基础之一。隔离性表示的是ACID中的I,事务隔离级别主要用来平衡在多个事务同时进行查询和变更时结果的性能、可靠性、一致性和可重复性之间的关系。

InnoDB提供了在SQL:1992标准中定义的四种隔离级别,未提交可读(READ_UNCOMMITED)、提交可读(READ_COMMITTED)、可重复读(REPEATABLE_READ)和串行访问(SERIALIZABLE)。InnoDB的默认隔离级别是可重复读。

用户可以使用SET TRANSACTION命令修改单个session或后续所有连接的隔离级别。在命令行中使用–transaction-isolation选项可以修改默认隔离级别。关于隔离级别的设置方法可以参考:Section 13.3.7, “SET TRANSACTION Statement”.

InnoDB使用不同的锁策略来支持每种不同的事务隔离级别。对于满足ACID非常重要的关键数据,可以使用默认的可重复读隔离级别,这个级别可以保证高度的一致性。在最大化的减少锁的开销比精确的一致性和可重复的结果更重要的场景下,比如批量报表,可以使用已提交可读或未提交可读级别,来放宽一致性规则。串行访问隔离级别执行比可重复读更加严格的一致性规则,主要用在特殊的场景下,比如XA事务或并发和死锁的问题排查中。

下面说明MySQL时如何支持不同事务隔离级别的,按照最常用的级别到最不常用的级别进行排序。

可重复读

这是InnoDB的默认隔离级别,在同一个事务中的一致性读,读取的是事务中第一次读时创建的快照。在这种隔离级别下,在事务中执行多个非阻塞的SELECT 语句,每个SELECT 结果与其他SELECT 是一致的。可参考:Section 15.7.2.3, “Consistent Nonlocking Reads”。对于需要锁的读操作(SELECT FOR UPDATE/FOR SHARE)、UPDATE、DELETE语句,锁策略取决于语句是否使用有唯一搜索条件的唯一索引,还是使用范围搜索条件。

  • 对于唯一搜索条件的唯一索引,InnoDB只锁查询到的索引记录,而不锁前面的间隙。

  • 对于其他的搜索条件,InnoDB会对扫描过的索引进行加锁,使用间隙锁和键前锁(next-key locks),来阻止其他session向扫描范围中的间隙中插入数据。对于间隙锁和键前锁,可参考:Section 15.7.1, “InnoDB Locking”.

提交可读

每次一致性读,即使是在同一个事务中,都会创建自己的快照,并从自己的快照中读取。对于一致性读的详细信息可参考:Section 15.7.2.3, “Consistent Nonlocking Reads”.

对于需要锁的读操作(SELECT FOR UPDATE/FOR SHARE)、UPDATE、DELETE语句,InnoDB只锁索引记录,不对前面的间隙上锁,因此允许对锁定记录前面的间隙中插入新数据。间隙锁只用在外键一致性检查和唯一键冲突检查上。

由于禁用间隙锁,其他session可以向间隙中插入数据,因此可能会出现幻读问题。对于幻读问题,可参考:Section 15.7.4, “Phantom Rows”.在读已提交隔离级别下,binlog只能使用row-based格式,如果设置了binlog_formate=MIXED,MySQL会自动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值