我有一个由不同线程同时读取的表。
每个线程必须选择100行,在每行上执行一些任务(与数据库无关),然后它们必须从表中删除选定的行。
使用此查询选择行:
SELECT id FROM table_name FOR UPDATE;
我的问题是:如何忽略(或跳过)以前使用MySQL中的select语句锁定的行?
我通常创建一个默认为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;
这样可以确保每个线程从表中选择唯一的行集。
希望这可以帮助。