多線程下不重複讀取SQL Server 表的資料,多線程sql

來源:互聯網
上載者:User

多線程下不重複讀取SQL Server 表的資料,多線程sql

在進行一些如傳送簡訊、郵件的業務時,我們經常會使用一個表來儲存待發送的資料,由後台多個線程不斷的從表中讀取待發送的資料進行發送,發送完成後再將資料轉移到曆史表中,這樣保證待發送表的資料一般情況下不會太多。如待發送表結構為:

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


C#實現多線程讀取同一張資料表,使用者擷取不重複記錄,怎實現!

這個可以通過修改資料的時間來判斷。
例如:
表中有個欄位 讀取時間。
當這個客戶讀取10條資料的時候,更新讀取時間為目前時間。
然後下個客戶讀取的時候,判斷時間在半個小時內,沒有更新的資料。就OK了。
不過這個也有一點不好的地方就是 很可能半小時後 第一個客戶還在使用這十條資料。

如果是修改資料的話 樓主可以 把資料庫表使用鎖定功能,把鎖住 這樣就不擔心重複提交的情況。

希望樓主早日解決問題~~~
 
sql server 資料庫 查詢不重複的記錄

不明白你到底要實現什麼...

補充:

select replyorder.*,revisitlist.* from replyorder
inner join (select 單據編號,回訪編號=min(回訪編號) from revisitlist group by 單據編號)as a on a.單據編號=replyorder.單據編號
inner join revisitlist on revisitlist.單據編號=replyorder.單據編號 and revisitlist.回訪編號=a.回訪編號
大資料量下不建議使用這種方式,最好部分資料冗餘
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.