


多線程下不重復(fù)讀取SQL Server的數(shù)據(jù)
在進行一些如發(fā)送短信、郵件的業(yè)務(wù)時,我們經(jīng)常會使用一個表來存儲待發(fā)送的數(shù)據(jù),由后臺多個線程不斷的從表中讀取待發(fā)送的數(shù)據(jù)進行發(fā)送,發(fā)送完成后再將數(shù)據(jù)轉(zhuǎn)移到歷史表中,這樣保證待發(fā)送表的數(shù)據(jù)一般情況下不會太多。如待發(fā)送表結(jié)構(gòu)為:
Create Table SMS(ID int not null identity(1,1),Content varchar(1024),Status int not null,CreateTime datetime);
Status 取值:0未讀取 1已讀取
這樣設(shè)計的好處是,不會因為后端有時發(fā)送過慢導(dǎo)致前端接收發(fā)送消息的請求出現(xiàn)問題,如發(fā)送短信的業(yè)務(wù),有時由于運營商的網(wǎng)關(guān)原因發(fā)送太慢,這樣前端可以先將用戶的發(fā)送請求全部放在待發(fā)送表中,由后端進行慢慢發(fā)送。
在后端發(fā)送進程一般使用
Select top 100 * From SMS Where Status=0;這樣的SQL取出未被讀取的數(shù)據(jù)。
為了提高后端發(fā)送能力,需要部署多個進程同時從待發(fā)送表中取出數(shù)據(jù)進行發(fā)送,這樣有時就會造成同一個記錄被多個進程同時取出來,并發(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
關(guān)鍵字:SQL Server、
記錄、多線程
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解