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

标签 sql database multithreading concurrency sybase

我有一个进程在表中查询 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/

相关文章:

sql - postgres 的 "fetch_status"替代方案

mysql - MySQL DB 中的外键约束给出错误

database - 如何在Postgresql中实现ACL

java - 减少斯坦福 corenlp 的执行时间?

c - Pthread_join() 在 C 中返回不正确的值

Java - 信号量的广泛使用

sql - 在 SQL 中按月生成年初至今报告

PHP Foreach 用于从数据库发送电子邮件?

mysql - 在 MySQL 数据库之间同步一张表

java - sql 和使用 spring 注入(inject)属性哪个更好