【问题标题】:make InnoDB only lock the row currently being UPDATEd?使 InnoDB 只锁定当前正在更新的行?
【发布时间】:2013-01-08 18:50:25
【问题描述】:

基于此answer 中的查询(请注意/假设GROUP_CONCATs 现在也保存在用户定义的变量中),InnoDB 将在何时以及什么情况下锁定table1

我希望它只锁定它当前正在更新的table1 行,并在下一行开始时释放它。

我还希望当它锁定 table2(或其行)时,SELECTs 至少能够读取它。

正在更新的列没有 PK 甚至没有索引。

这是如何实现的,或者它已经在这样做了?

这是TRIGGER

非常感谢!

【问题讨论】:

    标签: mysql locking sql-update innodb


    【解决方案1】:

    锁是为整个事务持有的(因为操作是原子的,这意味着要么所有的行都被更新,要么没有行),你不能改变它(不改变存储引擎)。但是它不会阻止读取(除非您处于SEIALIZABLE 隔离级别),因此将执行 SELECT 查询,但它们将读取旧值。只有 SELECT FOR UPDATE 和 SELECT...LOCK IN SHARE MODE 会被更新阻止。

    【讨论】:

    • 感谢您的回答!因此,由于我在一个查询中更新了所有table1,所以每一行都将被锁定,直到查询完成?如果我将其分解为CURSOR 循环并且由于它在TRIGGER 中,它会在每个查询完成时释放每个table1 吗?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多