Hub*_*ron 6 mysql locking race-condition
我有一个表由不同的线程同时读取.
每个线程必须选择100行,在每行上执行一些任务(与数据库无关),然后他们必须从表中删除所选行.
使用此查询选择行:
SELECT id FROM table_name FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何忽略(或跳过)先前在MySQL中使用select语句锁定的行?
Kri*_*son 15
我通常创建一个默认为NULL的process_id列,然后让每个线程使用唯一标识符来执行以下操作:
UPDATE table_name SET process_id = #{process.id} WHERE process_id IS NULL LIMIT 100;
SELECT id FROM table_name WHERE process_id = #{process.id} FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
这可确保每个线程从表中选择一组唯一的行.
希望这可以帮助.