另外我这个服务要部署到多台机器同时运行,读取同一个数据库的数据来处理。
现在的疑问就是,怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,即数据不被重复读取
表中的数据量非常大,上千万,每天几百万的数量级增加,数据有状态标识,处理过的数据会改变状态
9 个解决方案
#1
使用MSMQ,微软事务队列。
#2
#3
1)加个"处理中"的标志位,
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。
#4
怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,
分段处理 加标志位。lock
分段处理 加标志位。lock
#5
lock 只是对多线程有用而已吧。但是对分布在不同服务器的同时运行的服务就不行了
#6
我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。
你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx
可以同步不同机器的程序。
你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx
#7
#8
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
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
#3
1)加个"处理中"的标志位,
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。
2)每次查询"未处理"的任务。并在查询任务时按数据锁表(行锁)。
3)查询到任务状态变为"处理中"。
#4
怎么保证让每台服务器的服务的每个线程从数据库读取的数据都是不重复的,
分段处理 加标志位。lock
分段处理 加标志位。lock
#5
lock 只是对多线程有用而已吧。但是对分布在不同服务器的同时运行的服务就不行了
#6
我之前做了一个多客户端同步的测试。自己写了个类似PNunit的同步服务(WCF REST)的。
可以同步不同机器的程序。
你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx
可以同步不同机器的程序。
你可以参考下:
http://blog.csdn.net/fangxinggood/archive/2011/03/24/6272886.aspx
#7
#8
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
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