【发布时间】:2017-03-10 17:19:34
【问题描述】:
您有一个 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;
现在两个线程都可以更新行吗?
在任何一种情况下,如果两行都可以更新,解决此问题的正确方法是什么?
【问题讨论】:
标签: mysql multithreading