【发布时间】:2011-11-12 12:30:50
【问题描述】:
我在一个事务中进行了 2 个查询:SELECT(包含 JOIN 子句)和 UPDATE。在更新完成之前,要求所选行中的数据不要改变,所以我使用 FOR UPDATE 子句。我的问题是:“for update”是否仅适用于从 FROM 子句中指定的表中选择的部分数据,或者也适用于连接表中的数据?我的 DBMS 是 MySql。
【问题讨论】:
标签: mysql sql select sql-update
我在一个事务中进行了 2 个查询:SELECT(包含 JOIN 子句)和 UPDATE。在更新完成之前,要求所选行中的数据不要改变,所以我使用 FOR UPDATE 子句。我的问题是:“for update”是否仅适用于从 FROM 子句中指定的表中选择的部分数据,或者也适用于连接表中的数据?我的 DBMS 是 MySql。
【问题讨论】:
标签: mysql sql select sql-update
documentation 只是说锁定在读取的行上,不包括连接表,因此它应该在所有连接表上的所有记录上。如果您只想锁定其中一个表中的行,您可以单独执行此操作:'SELECT 1 FROM keytable WHERE ... FOR UPDATE'。
也就是说,这并不是为了简单地阻止 SELECT 和 UPDATE 之间的更新。 SELECT 上的读锁已经这样做了。 FOR UPDATE 的目的是防止另一个事务读取行并因此可能导致死锁,因为在另一个事务释放其读取锁之前无法应用 UPDATE。
【讨论】: