【问题标题】:MySQL InnoDB locks on joined rowsMySQL InnoDB 锁定连接的行
【发布时间】:2011-10-03 15:03:30
【问题描述】:

"SELECT ... FOR UPDATE" 是否会锁定 MySQL 中的连接行?

如果是这样,是否可以禁用此行为?

文档中没有关于此的内容。我已经看到 Oracle 支持 "SELECT ... FOR UPDATE OF table_name" 其中 table_name 是主表或受影响的行将被锁定的连接表之一,但我从未在 MySQL 的上下文中看到过这一点。

【问题讨论】:

  • 更新语句是否锁定其他表中的行?我认为它应该(可能取决于隔离级别),因为更新中的值可能取决于另一个表上的值。您需要用于更新吗?也许锁定共享模式是您正在寻找的?无论如何,我个人对这个答案很感兴趣,但也许唯一的判断方法就是测试这个。
  • 我已经对 InnoDB 插件提供的增强信息以及我的事务锁定的行数和我的应用程序的行为进行了一些研究,我想说 MySQL 正在锁定所有连接的行到主表的行。我还没有找到可以改变这一点的查询子句或 InnoDB 选项,所以我们现在似乎被这种默认行为所困扰。
  • 我在 MySQL 文档中找到了答案
  • 请问任何人都可以透露一个明确的答案吗?
  • 简短回答...是的。当 MySQL 文档中使用“SELECT ... FOR UPDATE 锁定行和任何关联的索引条目”中的 ... 时,暗示了这一点

标签: mysql join transactions innodb locks


【解决方案1】:

this MySQL doc page。它说:

锁定读取、UPDATE 或 DELETE 通常会在 SQL 语句处理过程中扫描的每条索引记录上设置记录锁。语句中是否存在将排除该行的 WHERE 条件并不重要。

和:

对于 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE,会为扫描的行获取锁,并希望为不符合包含在结果集中的行释放锁(例如,如果它们不符合 WHERE 子句中给出的标准)。但是,在某些情况下,行可能不会立即解锁,因为结果行与其原始源之间的关系在查询执行期间丢失。

“扫描的行”是指连接中使用的任何表中的行。

【讨论】:

    【解决方案2】:

    SELECT ... FOR UPDATE 锁定行和任何关联的索引条目,就像您为这些行发出 UPDATE 语句一样。

    然后

    如果启用了自动提交,则匹配规范的行不会被锁定。

    mySQL doc 不提供答案吗?

    【讨论】:

    • 不,文档中没有提到 JOIN。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多