代码之家  ›  专栏  ›  技术社区  ›  JoonT

“锁定表[表名称]写入”时发生“metadatalock”

  •  1
  • JoonT  · 技术社区  · 6 年前

    我像下面那样做的

    -- connection 1
    START TRANSACTION;
    LOCK TABLES [table_name] WRITE;
    
    -- connection 2
    START TRANSACTION;
    SELECT * FROM [table_name]; -- waiting for table metadata lock
    

    我不理解上述情况。
    我认为写锁不会阻止选择查询。

    当我喜欢下面的时候,

    -- connection 1
    START TRANSACTION;
    UPDATE [table_name] SET [column = value] WHERE id = 1;
    
    -- connection 2
    START TRANSACTION;
    SELECT * FROM [table_name] WHERE id = 1; -- doesn't wait
    

    选择不会像您看到的那样等待。
    我认为写锁也可以像update子句那样工作。
    但似乎不是……

    现在我知道有什么问题了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Bill Karwin    6 年前

    写锁不像行级锁那样工作。

    https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html 说:

    WRITE 锁:

    • 只有持有锁的会话才能访问表。在释放锁之前,任何其他会话都不能访问它。

    在此上下文中,“访问”是指读或写。