我在事务中进行了2次查询:SELECT(包含JOIN子句)和UPDATE。要求所选行中的数据在更新完成之前不会更改,因此我使用FOR UPDATE子句。我的问题是:'for update'是仅适用于从FROM子句中指定的表中选择的部分数据还是来自连接表的数据?我的DBMS是MySql。
答案 0 :(得分:6)
documentation只是说锁是在读取的行上而不是连接表,所以它应该在所有连接表的所有记录上。如果你只想锁定其中一个表中的行,你可以单独执行:'SELECT 1 FROM keytable WHERE ... FOR UPDATE'。
也就是说,不需要简单地阻止SELECT和UPDATE之间的更新。 SELECT上的读锁定已经完成了。 FOR UPDATE的目的是防止另一个事务读取行,从而可能导致死锁,因为在另一个事务释放其读锁之前无法应用UPDATE。