MySQL InnoDB对连接行的锁定

19

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

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

文档中没有关于此的说明。我看到Oracle支持"SELECT ... FOR UPDATE OF table_name",其中table_name是主表或其中一个连接表,将锁定受影响的行,但是我从未在MySQL上看到过这种情况。


更新语句是否会锁定其他表中的行?我认为应该会(也许取决于隔离级别),因为更新中的值可能取决于其他表中的值。您需要使用“for update”吗?也许“lock in share mode”是您要寻找的?无论如何,我个人对此问题很感兴趣,但也许唯一确定的方法就是进行测试。 - Maxim Krizhanovsky
我使用InnoDB插件提供的增强信息以及我的事务锁定的行数和应用程序的行为进行了一些研究,我认为MySQL除了主表的行之外,还锁定了所有连接的行。我没有找到可以更改此行为的查询子句或InnoDB选项,因此目前似乎我们被困在这种默认行为中。 - Miloš Rašić
我在MySQL文档中找到了答案。 - RolandoMySQLDBA
请问有人能否明确回答一下吗? - sibidiba
1
简短回答...是的。当MySQL文档使用“SELECT ... FOR UPDATE锁定行和任何相关的索引条目”时,这是暗示的。 - Jinglesting
2个回答

15
请参考 MySQL官方文档,其中提到:

在进行锁定读取、更新或删除时,通常会对处理SQL语句中扫描到的每个索引记录设置记录锁,无论语句中是否有WHERE条件与该行不符。

并且:

对于SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE,将为扫描到的行获取锁,并且预计将释放不符合结果集条件(例如,不满足WHERE子句中给定的条件)的行的锁。但是,在某些情况下,可能不会立即解锁行,因为查询执行过程中会丢失结果行与原始来源之间的关系。

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

-2
SELECT ... FOR UPDATE会锁定行和任何相关的索引条目,就像您为这些行发出UPDATE语句一样。
然后,如果启用了autocommit,则不会锁定与规范匹配的行。
这个MySQL文档难道没有提供答案吗?

6
不,文件中没有提到JOIN。 - Miloš Rašić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接