忽略MySQL查询中的锁定行

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)

这可确保每个线程从表中选择一组唯一的行.

希望这可以帮助.