【问题标题】:Difference between FOR UPDATE and START TRANSACTION in InnoDBInnoDB 中 FOR UPDATE 和 START TRANSACTION 的区别
【发布时间】:2020-05-13 22:47:08
【问题描述】:

我需要从 innoDB 表中读取一行,在我的代码中进行一些计算,然后(也许)更新该行。我需要对行进行独占访问,这意味着如果 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;

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

【问题讨论】:

    标签: mysql transactions sql-update innodb


    【解决方案1】:

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

    首先,由于您没有打开事务,SELECTUPDATE 查询是两个独立的事务。

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

    应该是的

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

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多