【问题标题】:Does 'for update' row blocking works also for joined tables?'for update' 行阻塞是否也适用于连接表?
【发布时间】:2011-11-12 12:30:50
【问题描述】:

我在一个事务中进行了 2 个查询:SELECT(包含 JOIN 子句)和 UPDATE。在更新完成之前,要求所选行中的数据不要改变,所以我使用 FOR UPDATE 子句。我的问题是:“for update”是否仅适用于从 FROM 子句中指定的表中选择的部分数据,或者也适用于连接表中的数据?我的 DBMS 是 MySql。

【问题讨论】:

    标签: mysql sql select sql-update


    【解决方案1】:

    documentation 只是说锁定在读取的行上,不包括连接表,因此它应该在所有连接表上的所有记录上。如果您只想锁定其中一个表中的行,您可以单独执行此操作:'SELECT 1 FROM keytable WHERE ... FOR UPDATE'。

    也就是说,这并不是为了简单地阻止 SELECT 和 UPDATE 之间的更新。 SELECT 上的读锁已经这样做了。 FOR UPDATE 的目的是防止另一个事务读取行并因此可能导致死锁,因为在另一个事务释放其读取锁之前无法应用 UPDATE。

    【讨论】:

    • “也就是说,这并不是为了简单地阻止 SELECT 和 UPDATE 之间的更新。SELECT 上的读锁已经这样做了”我认为这不是真的。仅当您执行 SELECT ... LOCK IN SHARE MODE 时,这才是正确的
    猜你喜欢
    • 2017-12-15
    • 2011-04-05
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2011-03-31
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多