MySQL 学习(四):锁定读

说明在之前的博文《MySQL学习(三): 一致性非锁定读和 MVCC》 中,我通过翻译官方文档简单介绍了 MySQL 的一致性非锁定读和 MVCC 的基本知识,在本篇博文中我将继续通过官方文档来介绍 InnoDB 事务模型中关于锁定读的相关内容,对应《Locking Reads》章节。通过本篇博文,我们应该了解到在什么情况下应该使用锁定读,并且锁定读有哪些实现方式,不同方式之间有什么区别。正文锁定读在同一个事务中,你如果在查询数据之后,再对相关数据进行插入或更新时,常规的 SELECT 语句无法给
摘要由CSDN通过智能技术生成

说明

在之前的博文《MySQL学习(三): 一致性非锁定读和 MVCC》 中,我通过翻译官方文档简单介绍了 MySQL 的一致性非锁定读和 MVCC 的基本知识,在本篇博文中我将继续通过官方文档来介绍 InnoDB 事务模型中关于锁定读的相关内容,对应《Locking Reads》章节。

通过本篇博文,我们应该了解到在什么情况下应该使用锁定读,并且锁定读有哪些实现方式,不同方式之间有什么区别。

正文

锁定读

在同一个事务中,你如果在查询数据之后,再对相关数据进行插入或更新时,常规的 SELECT 语句无法给这些操作足够的安全保障,这是因为其他事务可能在你刚读取数据之后就对相同数据进行了更新或删除操作。对此,InnoDB 支持两种类型的锁定读来提供额外的安全保障:

SELECT … FOR SHARE

该语句对读取的行设置了一个共享锁。其他事务可以读取锁定的行,但是无法修改直到你的事务提交。如果要读取行已经被其他未提交的事务修改,你的查询将会一直等待直到事务结束后读取到最新值。

以下示例演示了在一个事务中进行数据的修改,其他事务对相同行的锁定读会被阻塞的情况:

注意
SELECT … FOR SHARE 语句是 SELECT … LOCK IN SHARE MODE 的替代品,两者完全一致,但后者为了向后兼容性被保留了下来。但前者支持新的特性,支持 table_name, NOWAIT, SKIP LOCKED 等操作。

在 MySQL 8.0.22 之前,SELECT … FOR SHARE 要求 SELECT 权限和 DELETE, LOCK TABLES 或 UPDATE 三种操作中至少一个权限,但在 8.0.22 版本中,只需要 SELECT 权限。

同时在 8.0.22 版本中。SELECT … FOR SHARE 语句不需要获取 MySQL grant

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值