我们有一个高性能的Django Web应用程序,它利用MySQL的InnoDB的行级锁定。在我们的代码中,我们看到(在流程A中)表中的特定行是否可用SELECT … FOR UPDATE
。如果有另一个正在使用该行的进程(B),并且首先到达那里,那么该行将存在一个独占锁,并且A将获得“锁定等待超时”异常。 A会抓住这个,然后继续尝试另一行(使用类似的SELECT … FOR UPDATE
方法)。
但是,我不能100%确定锁定等待超时发生时会发生什么。在B完成并释放它的锁之后,即使A''select ... for update'查询已经超时,并且A已经移动以锁定另一行,是否会给A一个独占锁定。
或(这是我认为直觉上发生的事情),在A尝试获取锁定失败后,它继续前进,并且B提交并完成:是否没有进一步尝试给予锁定到A?
从官方MySQL文档中获取的任何引用/引用都是最好的,因为它是规范的来源。我在文档中找不到任何内容具体解决当您尝试获取锁定并且超时时会发生什么。
答案 0 :(得分:3)
永远不会获得超时的声明所要求的锁定:
When a lock wait timeout occurs, the current statement is rolled back.
以下测试表明了这一事实:
-- "atable" is an InnoDB table
-- Connection #1
BEGIN;
UPDATE atable SET acol = 1 WHERE acol = 2;
-- Connection #2
BEGIN;
SELECT * FROM atable FOR UPDATE; -- hangs
-- Connection #3
BEGIN;
SELECT * FROM atable FOR UPDATE; -- hangs
-- wait until Connection #2 times out
-- Connection #2
-- "Lock wait timeout exceeded"
-- Connection #1
COMMIT;
-- Connection #3 resumes execution and data is displayed