我有一个进程在表中查询 PROCESS_IND
= 'N' 的记录,进行一些处理,然后将 PROCESS_IND
更新为 'Y'。
我想允许此进程的多个实例运行,但不知道避免并发问题的最佳做法是什么。
我应该从哪里开始?
最佳答案
我要使用的模式如下:
- 创建列“lockedby”和“locktime”,它们分别是线程/进程/机器 ID 和时间戳(在多台机器之间拆分处理时需要机器 ID)
每个任务都会执行一个查询,例如:
更新任务表 SET lockedby=(my id), locktime=now() WHERE lockedby IS NULL ORDER BY ID LIMIT 10
其中 10 是“批量大小”。
- 然后每个任务执行 SELECT 以找出它“锁定”了哪些行以进行处理,并处理这些行
- 每行完成后,将 lockedby 和 locktime 设置回 NULL
- 所有这些都是在循环中完成的,适用于现有的批处理。
- cron 作业或计划任务会定期重置锁定时间过长的任何行的“lockedby”,因为它们可能是由已挂起或崩溃的任务完成的。然后其他人会来接他们
LIMIT 10 是 MySQL 特定的,但其他数据库也有等效项。导入 ORDER BY 以避免查询不确定。
关于sql - 多线程处理数据库记录的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/562780/