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;
我不确定更喜欢哪一个。看起来,两者都在做同样的事情,这是真的吗?一种解决方案可能比另一种更快?
两种解决方案都是错误的。
首先,因为您没有开启交易,所以 SELECT
和 UPDATE
查询是两个单独的交易。
其次,因为 SELECT
没有获得您正在寻找的独占锁。
必须
START TRANSACTION;
SELECT * FROM table WHERE myid=1234 FOR UPDATE;
[CalculateCalculateCalculate]
UPDATE table SET ... WHERE myid=1234;
COMMIT;
我需要从 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;
我不确定更喜欢哪一个。看起来,两者都在做同样的事情,这是真的吗?一种解决方案可能比另一种更快?
两种解决方案都是错误的。
首先,因为您没有开启交易,所以 SELECT
和 UPDATE
查询是两个单独的交易。
其次,因为 SELECT
没有获得您正在寻找的独占锁。
必须
START TRANSACTION;
SELECT * FROM table WHERE myid=1234 FOR UPDATE;
[CalculateCalculateCalculate]
UPDATE table SET ... WHERE myid=1234;
COMMIT;