如何避免在不使用锁定的情况下在同一任务记录上工作的多线程



我有一个应用程序,需要将Windows服务与多个线程使用Windows Service从SQL Server Tabt或MongoDB Collection读取100个任务记录,一旦线程完成以读取100个任务,则必须要将状态从0("不处理")设置为50(表示"处理"),那么该线程将执行一些业务逻辑,一旦完成,然后将状态从50更新为100(含义为'DONDOR')或 - 1(表示"遇到错误")。我的问题是,如果我选择不使用锁?

,如何防止几个不同的线程从表中读取相同的100条记录?

这很简单。只需选择合理数量的记录即可在通行证中处理。假设您有53,000个记录,您选择250个记录作为每次通行证的数字。这意味着您有212个需要完成的工作单元,并且可以将它们从0到211。工作单元N包括记录250*N250*N+249包含在内。

现在,问题减少了,使每个线程一个撤消工作单元要做。只要所有工作单元都完成并且没有两个线程尝试执行相同的工作单元,就不需要数据库锁。

如何将工作单元分配给线程是特定于语言的。但是最简单的方法是使用某种线程池并将每个工作单元派遣到该线程池。

最新更新