一尘不染

数据库记录多线程处理的最佳实践

sql

我有一个单一的过程,可以查询表以获取PROCESS_IND=’N’的记录,进行一些处理,然后将其更新PROCESS_IND为’Y’。

我想允许该过程的多个实例运行,但不知道避免并发问题的最佳实践是什么。

我应该从哪里开始?


阅读 129

收藏
2021-03-17

共1个答案

一尘不染

我将使用的模式如下:

  • 创建列“ lockedby”和“ locktime”,它们分别是线程/进程/机器ID和时间戳(在多台机器之间拆分处理时,您将需要机器ID)
  • 每个任务都会执行一个查询,例如:

UPDATE TasksTable SET Lockedby =(我的ID),locktime = now()WHEREBYBY IS IS NULL
ORDER BY ID LIMIT 10

其中10是“批量大小”。

  • 然后,每个任务都会执行SELECT来找出其“锁定”了哪些行以进行处理,并对这些行进行处理
  • 每行完成后,将lockedby和locktime设置回NULL
  • 所有这些都是在一个循环中完成的,与现有的批次一样多。
  • Cron作业或计划任务会定期重置锁定时间太久的任何行的“ lockedby”,因为它们大概是由挂起或崩溃的任务完成的。然后其他人会接他们

LIMIT 10是特定于MySQL的,但其他数据库具有等效功能。导入ORDER BY可以避免查询不确定。

2021-03-17