我有一个进程查询表中的记录,其中PROCESS_IND
='N',进行一些处理,然后更新PROCESS_IND
为'Y'.
我想允许运行此进程的多个实例,但不知道避免并发问题的最佳实践是什么.
我应该从哪里开始?
我使用的模式如下:
创建"lockedby"和"locktime"列,分别是线程/进程/计算机ID和时间戳(当您在多台计算机之间拆分处理时,您将需要计算机ID)
每个任务都会执行以下查询:
UPDATE taskstable SET lockedby =(我的id),locktime = now()WHERE lockedby IS NULL ORDER BY ID LIMIT 10
其中10是"批量大小".
然后每个任务执行SELECT以找出它被"锁定"以进行处理的行,并处理这些行
每行完成后,将lockedby和locktime设置为NULL
所有这些都是在循环中完成,因为存在的批次数量很多.
cron作业或计划任务会定期重置锁定时间过长的任何行的"lockedby",因为它们可能是由挂起或崩溃的任务完成的.然后其他人会接他们
LIMIT 10是MySQL特定的,但我认为其他数据库具有等价物.导入ORDER BY是为了避免查询不确定.