MySQL DBA's Blog

一个关于主键排他锁的问题

上个星期,周青给我发了一个很神奇的东西。我在不同版本的MySQL上面试了一下,发现都存在这样的现象。以下是截图:
update
事务1在主键a=7上面加了排他锁,事务2就无法在主键a<=6上面加排他锁了。
初步认为是Next-key lock导致了这个问题。具体原因有待确证。

Tags: , , , ,

4 Responses to “一个关于主键排他锁的问题”

  1. Willko Says:

    是和next key有关。。。

  2. Steven.he Says:

    这个也有一个可能是跟执行计划有关系.
    当你的表很小时, 第一个SELECT可能走全表扫描的.而导致锁了全表.

    你可以试试数据达到一定量了以后,就不会有这种情况.
    INNODB,对主键的访问,正常情况下是不会有NEXTKEY锁的.

  3. realzyy Says:

    @Steven.he Says:
    好像和全表扫描没有关系,执行计划如下。
    mysql> explain select * from test where a=7 for update \G;
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: test
    type: const
    possible_keys: PRIMARY
    key: PRIMARY
    key_len: 4
    ref: const
    rows: 1
    Extra:
    1 row in set (0.00 sec)

  4. 老布丁的Central Perk » next-key lock和 gap lock的些许疑问 Says:

    [...] 昨天看了realzyy兄的一篇文章一个关于主键排他锁的问题,觉得很有意思,然后做了一些实验: [...]

Leave a Reply