【问题标题】:Mysql InnoDB row locking from readMysql InnoDB 从读取中锁定行
【发布时间】:2012-10-14 05:53:35
【问题描述】:

我已经阅读了 mysql 文档,也许我只是不完全理解。我正在寻找的是来自 readingrow locking 用于其他会话。当该行被锁定时,我希望其他会话等待直到锁定被释放。我不希望其他会话从快照中读取!他们必须等到发布!

我想要得到的和下面的例子完全一样,但是对于单行而不是整个表锁:

START TRANSACTION
LOCK TABLES table1 WRITE
SELECT * FROM table1 WHERE id = 40912
UPDATE table1 SET column1 = 'value1' WHERE id = 40912
UNLOCK TABLES
COMMIT

提前谢谢你!

【问题讨论】:

    标签: mysql transactions locking isolation mvcc


    【解决方案1】:

    Elena Sharovar 的回答是一种方法,但可能没有完全解释需要什么。 每个将执行 SELECT 的进程都需要使用具有相同字符串的 GET_LOCK。如果他们这样做了,MySQL 将自动等待(最多指定的秒数)返回结果,直到另一个线程释放锁。

    这是发生的事情,时间从上到下进行:

              THREAD 1                                 THREAD 2
    DO GET_LOCK("table1.40912", 30)
    SELECT * FROM table1 WHERE id=40912     DO GET_LOCK("table1.40912", 30)
    [UPDATE query]                          [automatically waits]
    [UPDATE query]                          [automatically waits]
    DO RELEASE_LOCK("table1.40912")         [lock finally obtained, query terminates]
                                            SELECT * FROM table1 WHERE id=40912
    

    【讨论】:

      【解决方案2】:

      我对这个有趣的问题(如何强制 MySQL 不读取快照,即使快照是一致的)的最佳想法是使用“FOR UPDATE”读取所有内容,如“SELECT FOR UPDATE #select-子句#”。

      但是,这些选择使用非常窄的索引查找记录非常重要,这意味着它们会锁定所读取的内容。通过全表扫描甚至 USING WHERE(在 EXPLAIN 语句中)让 SELECT 疯狂运行会很糟糕,表的大部分区域的长时间锁定可能会导致潜在的较长反应时间。

      我建议您在数据库抽象层中对其进行测试。

      您可以在isolation documentation 中阅读有关此机制的所有信息。

      【讨论】:

        【解决方案3】:

        我还没有尝试这样做,但是可以使用 MySQL 函数 GET_LOCK(str,timeout) 和 RELEASE_LOCK(str)。这里的“str”是标识你的锁的任何字符串。

        mysql_query('DO GET_LOCK("table1.40912", 60)')
        mysql_query('SELECT * FROM table1 WHERE id = 40912')
        mysql_query('UPDATE table1 SET column1 = 'value1' WHERE id = 40912')
        mysql_query('DO RELEASE_LOCK("table1.40912")') 
        

        【讨论】:

        • 嗨!谢谢你的回答,但它似乎不起作用......另一个会话(选择)仍然返回快照中的值!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多