gpt4 book ai didi

MySQL InnoDB 并发更新

转载 作者:行者123 更新时间:2023-11-29 10:58:09 27 4
gpt4 key购买 nike

您有一个 InnoDB 表 A,其中包含以下两列:id (PK)、status

两个线程按以下顺序访问表:

Thread 1: SELECT id from A where status = 0 LIMIT 1;
Thread 2: SELECT id from A where status = 0 LIMIT 1;

两个线程都选择 id 1。

Thread 1: UPDATE A SET status = 1 WHERE id = 1 AND status = 0;
Thread 2: UPDATE A SET status = 2 WHERE id = 1 AND status = 0;

两个线程是否有可能更新同一行?

现在添加交易:

Thread 1: SELECT id from A where status = 0 LIMIT 1;
Thread 2: SELECT id from A where status = 0 LIMIT 1;
Thread 1: START TRANSACTION;
Thread 2: START TRANSACTION;
Thread 1: UPDATE A SET status = 1 WHERE id = 1 AND status = 0;
Thread 2: UPDATE A SET status = 2 WHERE id = 1 AND status = 0;
Thread 1: COMMIT;
Thread 2: COMMIT;

现在两个线程都可以更新该行吗?

无论哪种情况,如果可以更新两行,解决此问题的正确方法是什么?

最佳答案

InnoDB 上默认的锁定机制是 REPEATABLE_READ(请参阅 https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html#isolevel_repeatable-read)。这意味着,如果您对同一个索引进行两次更新,则将以原子方式完成,但是我不相信您可以保证哪个更新将首先完成,而不在程序中添加一些逻辑。 (第一次更新将由首先获取锁的线程完成)。

因此,为了管理更新以正确的顺序完成,您需要在程序内部实现逻辑(如果是 Java,我会查看 BarrierLatchesSemaphores )。

关于MySQL InnoDB 并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42714354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com