我有一个应用程序,需要使用多个线程的Windows服务从SQL服务器表或mongodb集合中读取100个任务记录,一旦线程完成读取100任务,就必须将状态设置为0('不处理')到50(意味着'处理'),然后线程将执行一些业务逻辑,一旦完成,然后将状态从50更新为100(意味着'完成')或-1(意味着'遇到错误') 。我的问题是如果我选择不使用锁,如何防止几个不同的线程从表中读取相同的100条记录?
答案 0 :(得分:0)
这非常简单。只需选择合理数量的记录即可处理。假设您有53,000条记录,并且您选择250作为每次通过的数字。这意味着您需要完成212个工作单元,并且可以从0到211(包括0和211)对它们进行编号。工作单位N
包括250*N
到250*N+249
的记录。
现在问题在于为每个线程提供一个撤消的工作单元。只要所有工作单元都完成并且没有两个线程尝试执行相同的工作单元,就不需要数据库锁。
如何将工作单位分配给线程是特定于语言的。但最简单的方法是使用某种线程池并将每个工作单元分派给该线程池。