多线程多进程服务的数据队列处理怎么样解决重复读取的问题【很难希望能推荐】

时间:2021-10-18 16:41:24
我现在要开发一个多线程的服务来读取数据库表中的队列数据出来进行处理。处理过程中要调用webservice之类的接口,所以处理过程中可能会出错,导致有些数据会处理失败。
另外我这个服务要部署到多台机器同时运行,读取同一个数据库的数据来处理。
现在的疑问就是,怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,即数据不被重复读取

表中的数据量非常大,上千万,每天几百万的数量级增加,数据有状态标识,处理过的数据会改变状态

9 个解决方案

#1


使用MSMQ,微软事务队列。

#2


该回复于2011-05-17 08:35:50被版主删除

#3


1)加个"处理中"的标志位,
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。

#4


怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,

分段处理 加标志位。lock

#5


引用 4 楼 wxr0323 的回复:
怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,

分段处理 加标志位。lock


lock 只是对多线程有用而已吧。但是对分布在不同服务器的同时运行的服务就不行了

#6


我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。

你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx

#7


该回复于2011-05-17 10:05:13被版主删除

#8


引用 6 楼 fangxinggood 的回复:
我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。

你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx

0 0....表示没接触过,高....

#9


BEGIN TRAN
SELECT TOP 1 @Id=Id FROM tb WITH(UPDLOCK, READPAST) 
WHERE [Status]=0 --待处理
OR [Status] = 2 --处理失败
UPDATE tb SET [Status]=1--处理中
WHERE Id=@Id AND ([Status]=0 OR [Status]=2)
COMMIT

#1


使用MSMQ,微软事务队列。

#2


该回复于2011-05-17 08:35:50被版主删除

#3


1)加个"处理中"的标志位,
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。

#4


怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,

分段处理 加标志位。lock

#5


引用 4 楼 wxr0323 的回复:
怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,

分段处理 加标志位。lock


lock 只是对多线程有用而已吧。但是对分布在不同服务器的同时运行的服务就不行了

#6


我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。

你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx

#7


该回复于2011-05-17 10:05:13被版主删除

#8


引用 6 楼 fangxinggood 的回复:
我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。

你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx

0 0....表示没接触过,高....

#9


BEGIN TRAN
SELECT TOP 1 @Id=Id FROM tb WITH(UPDLOCK, READPAST) 
WHERE [Status]=0 --待处理
OR [Status] = 2 --处理失败
UPDATE tb SET [Status]=1--处理中
WHERE Id=@Id AND ([Status]=0 OR [Status]=2)
COMMIT