數(shù)據(jù)庫:多線程下不重復(fù)讀取SQLServer的數(shù)據(jù)
時間:
家輝2
資訊
在后端發(fā)送進(jìn)程一般使用
Select top 100 * From SMS Where Status=0;這樣的SQL取出未被讀取的數(shù)據(jù)。
為了提高后端發(fā)送能力,需要部署多個進(jìn)程同時從待發(fā)送表中取出數(shù)據(jù)進(jìn)行發(fā)送,這樣有時就會造成同一個記錄被多個進(jìn)程同時取出來,并發(fā)送的情況。
今天查了一下SQL Server 的MSDN,發(fā)現(xiàn)可以通過先更新同時通過deleted表(就像是在觸發(fā)器中使用一樣)取出的方式,來保證每條記錄只會被讀取一次。
declare @Rowid table(rowid int);
BEGIN
set rowcount 100; --一次讀取的行數(shù)
--先將要讀取的記錄狀態(tài)更新
update Sms set [status]= 1 output deleted.ID into @Rowid Where [status] = 0;
--讀取剛更新狀態(tài)的記錄
select * from Sms where ID in (select Rowid from @Rowid);
END