1. 程式人生 > >多線程下不反復讀取SQL Server 表的數據

多線程下不反復讀取SQL Server 表的數據

identity -- not 能力 get sof net rgb 故障

在進行一些如發送短信、郵件的業務時,我們常常會使用一個表來存儲待發送的數據,由後臺多個線程不斷的從表中讀取待發送的數據進行發送,發送完畢後再將數據轉移到歷史表中,這樣保證待發送表的數據普通情況下不會太多。如待發送表結構為:

Create Table SMS(ID int not null identity(1,1),Content varchar(1024),Status int not null,CreateTime datetime);

Status 取值:0未讀取 1已讀取

這樣設計的優點是,不會由於後端有時發送過慢導致前端接收發送消息的請求出現故障。如發送短信的業務,有時由於運營商的網關原因發送太慢,這樣前端能夠先將用戶的發送請求所有放在待發送表中,由後端進行慢慢發送。

在後端發送進程一般使用

Select top 100 * From SMS Where Status=0;這種SQL取出未被讀取的數據。

為了提高後端發送能力。須要部署多個進程同一時候從待發送表中取出數據進行發送,這樣有時就會造成同一個記錄被多個進程同一時候取出來。並發送的情況。

今天查了一下SQL Server 的MSDN。發現能夠通過先更新同一時候通過deleted表(就像是在觸發器中使用一樣)取出的方式。來保證每條記錄僅僅會被讀取一次。

declare @Rowid table(rowid int);
BEGIN
set rowcount 100; --一次讀取的行數
--先將要讀取的記錄狀態更新
update Sms set [status]= 1 output deleted.ID into @Rowid Where [status] = 0;
--讀取剛更新狀態的記錄
select * from Sms where ID in (select Rowid from @Rowid);
END


很多其它關註付義方技術博客:http://blog.csdn.net/fuyifang

多線程下不反復讀取SQL Server 表的數據