繁体   English   中英

MySQL InnoDB并发更新

[英]MySQL InnoDB concurrent updates

您有一个具有以下两列的InnoDB表A:id(PK),状态

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

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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM