SELECT FOR UPDATE语句深度解析

  MysqlSELECT ... FOR UPDATE 语句是日常使用较多的用于锁定资源,确保在多个事务读取数据时始终能够读取到最新版本的数据的有效语句。那么它是怎么实现呢?在经过官网文档以及大量实践的验证之后发现网上存在大量不严谨甚至错误的信息,因此通过本文对 SELECT FOR UPDATE 语句作出以下总结。在具体介绍之前,先对目前网上教程或博客中会提到的几个常见误区进行纠正:

  • SELECT FOR UPDATE 在xx情况下会添加表级锁。

    请注意,在任何情况下 SELECT FOR UPDATE 都不会添加表级锁。事实上,在大部分情况下(DQL 语句,DML 语句,DDL 语句)都不会添加表锁,取而代之的是各种类型的行锁。

      那么我们如何获取表锁呢?语句如下:

    1
    2
    LOCK TABLES xx READ; # 为 xx 表添加表级 S 锁
    LOCK TABLES xx WRITE; # 为 xx 表添加表级 X 锁

    然后我们可以通过以下语句来检测当前 Mysql 有哪些表获取了表级锁

    1
    SHOW OPEN TABLES WHERE In_use > 0

    更多的表级锁相关知识请参考官网介绍

  • SELECT FOR UPDATE 在未使用索引时会”锁表”。

    SELECT FOR UPDATE 确实可以通过 Next-key lock 锁住所有记录和间隙来实现和表锁类似的效果。但未使用索引并非充分条件,我们判断 SELECT FOR UPDATE 是否锁住了所有数据和间隙还需要看它的隔离级别。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×