InnoDB 中 FOR UPDATE 和 START TRANSACTION 的区别

Difference between FOR UPDATE and START TRANSACTION in InnoDB

我需要从 innoDB-table 中读取一行,在我的代码中进行一些计算,然后(可能)更新该行。我需要独占访问该行,这意味着如果 2 个进程同时访问同一行,一个进程应该等待读取该行,直到另一个进程完成更新。

我找到了 2 个可能的解决方案:

SELECT * FROM table WHERE myid=1234 FOR UPDATE;
[CalculateCalculateCalculate]
UPDATE table SET ... WHERE myid=1234;

START TRANSACTION;
SELECT * FROM table WHERE myid=1234;
[CalculateCalculateCalculate]
UPDATE table SET ... WHERE myid=1234;
COMMIT;

我不确定更喜欢哪一个。看起来,两者都在做同样的事情,这是真的吗?一种解决方案可能比另一种更快?

两种解决方案都是错误的。

首先,因为您没有开启交易,所以 SELECTUPDATE 查询是两个单独的交易。

其次,因为 SELECT 没有获得您正在寻找的独占锁。

必须

START TRANSACTION;
SELECT * FROM table WHERE myid=1234 FOR UPDATE;
[CalculateCalculateCalculate]
UPDATE table SET ... WHERE myid=1234;
COMMIT;