Prayer
在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
C++博客
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
C#--多進(jìn)程多線程訪問(wèn)數(shù)據(jù)庫(kù)
Posted on 2008-08-26 15:33
Prayer
閱讀(1858)
評(píng)論(0)
編輯
收藏
引用
所屬分類(lèi):
數(shù)據(jù)庫(kù),SQL
如何讓多進(jìn)程多線程訪問(wèn)數(shù)據(jù)庫(kù),而不會(huì)選擇相同的數(shù)據(jù),這在設(shè)計(jì)分布式程序的時(shí)候經(jīng)常用到,多臺(tái)機(jī)器的多個(gè)進(jìn)程,每個(gè)進(jìn)程都有多個(gè)線程,每個(gè)線程要從數(shù)據(jù)庫(kù)里取數(shù)據(jù)來(lái)處理,要實(shí)現(xiàn)不能漏取數(shù)據(jù),也不能重復(fù)取數(shù)據(jù),這里給出答案
創(chuàng)建一個(gè)數(shù)據(jù)表,如下,一個(gè)自增列,一個(gè)表示rss鏈接地址
CREATE
TABLE
[
dbo
]
.
[
Rss_RssSources
]
(
[
SourceId
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
[
Link
]
[
varchar
]
(
1024
)
NOT
NULL
)
ON
[
PRIMARY
]
先放1w條數(shù)據(jù)
declare
@i
int
set
@i
=
1
while
@i
<
10000
begin
select
@i
=
@i
+
1
insert
into
[
Rss_RssSources
]
values
(
newid
())
end
再創(chuàng)建一個(gè)鎖表,一個(gè)字段表示是否已經(jīng)鎖定的資源,另一個(gè)表示已經(jīng)讀取的rss源的最大id
create
table
Rss_RssSourceLock
(
IsLock
bit
,
MaxSourceId
int
)
初始化數(shù)據(jù)
insert
into
Rss_RssSourceLock
values
(
0
,
0
)
下面我們要設(shè)計(jì)一個(gè)存儲(chǔ)過(guò)程,讓這個(gè)存儲(chǔ)過(guò)程每次返回10個(gè)rss源,知道返回所有的rss源,要求無(wú)遺漏,無(wú)重復(fù)返回。如下
CREATE
PROCEDURE
[
dbo
]
.
[
USP_GetRssSources
]
AS
BEGIN
if
exists
(
select
*
from
Rss_RssSourceLock
with
(READPAST)
where
IsLock
=
0
)
begin
declare
@select_count
int
begin
tran
update
Rss_RssSourceLock
set
IsLock
=
1
if
object_id
(
'
tempdb..#t
'
)
is
not
null
drop
table
#t
select
top
10
a.
*
into
#t
from
[
Rss_RssSources
]
as
a
inner
join
Rss_RssSourceLock
as
b
on
a.SourceId
>
b.MaxSourceId
order
by
a.
[
SourceId
]
select
@select_count
=
count
(
*
)
from
#t
update
Rss_RssSourceLock
set
IsLock
=
0
,MaxSourceId
=
MaxSourceId
+
@select_count
select
*
from
#t
commit
tran
end
END
1、如果鎖表里顯示沒(méi)有進(jìn)程正在讀取rss源(IsLock = 0),那么就返回從最大的rss源id往后的10個(gè)rss源,否則返回空。
2、 用with(READPAST)表示忽略鎖住的行,如果另一個(gè)進(jìn)程正在執(zhí)行update Rss_RssSourceLock的語(yǔ)句,并且在事務(wù)提交前,update語(yǔ)句會(huì)鎖住這些要更新的行,而Rss_RssSourceLock表就一行數(shù) 據(jù),這時(shí)候select Rss_RssSourceLock表并且忽略被鎖的行肯定是沒(méi)數(shù)據(jù)的,所以本次存儲(chǔ)過(guò)程執(zhí)行會(huì)返回空。
3、begin tran和commit tran保證了即使本次存儲(chǔ)過(guò)程出錯(cuò),也不會(huì)讓Rss_RssSourceLock表處于IsLock = 1的臟數(shù)據(jù)狀態(tài),如果處于這種狀態(tài),后面的進(jìn)程執(zhí)行存儲(chǔ)過(guò)程就永遠(yuǎn)也返回不了數(shù)據(jù)了。
4、因?yàn)橛袝r(shí)候一次選取的記錄可能不夠10條,所以這里用了個(gè)臨時(shí)表來(lái)暫存記錄,再算出來(lái)選取的條數(shù),最后更新Rss_RssSourceLock表的MaxSourceId字段。但用臨時(shí)表肯定會(huì)增加數(shù)據(jù)庫(kù)的壓力,這里不知道用表變量是不是會(huì)改善性能,暫時(shí)先這樣了。
5、應(yīng)用里調(diào)用這個(gè)存儲(chǔ)過(guò)程,如果返回了數(shù)據(jù),就進(jìn)行處理,如果沒(méi)返回?cái)?shù)據(jù),就sleep幾秒才執(zhí)行,直到返回?cái)?shù)據(jù)。
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
兩階段提交
主鍵與唯一索引
DB2 Merge語(yǔ)句
LDAP
三十五個(gè)非主流開(kāi)源數(shù)據(jù)庫(kù) MongoDB領(lǐng)銜主演
系統(tǒng)臨時(shí)表使用問(wèn)題
WITH HOLD
事務(wù)--<
>
MINUS EXCEPT
OLAP與OLTP的一些基礎(chǔ)知識(shí)
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
Powered by:
C++博客
Copyright © Prayer
日歷
<
2009年5月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(28)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
C/C++(131)
CVS(8)
DB2(337)
DB2CLI(12)
DB2k(3)
GLASSFISH(1)
LINUX/UNIX/AIX(316)
makefile(30)
PERL(6)
Shell(233)
SOCKET(68)
TOOLS(5)
TUXEDO(19)
U基礎(chǔ)管理(12)
計(jì)算機(jī)基礎(chǔ)(4)
金融相關(guān)(66)
面向?qū)ο?10)
日常技巧(99)
數(shù)據(jù)庫(kù),SQL(101)
算法(6)
系統(tǒng)、備份等(28)
組件(2)
隨筆檔案
2019年6月 (2)
2019年4月 (8)
2019年3月 (10)
2019年2月 (9)
2019年1月 (10)
2018年11月 (16)
2012年4月 (2)
2012年3月 (13)
2012年2月 (2)
2012年1月 (1)
2011年12月 (15)
2011年10月 (1)
2010年12月 (1)
2010年11月 (4)
2010年10月 (10)
2010年9月 (18)
2010年8月 (10)
2010年7月 (5)
2010年6月 (3)
2010年5月 (46)
2010年4月 (25)
2010年3月 (56)
2010年2月 (36)
2010年1月 (50)
2009年12月 (30)
2009年11月 (21)
2009年10月 (19)
2009年9月 (44)
2009年8月 (111)
2009年7月 (71)
2009年6月 (37)
2009年5月 (52)
2009年4月 (89)
2009年3月 (59)
2009年2月 (37)
2009年1月 (33)
2008年12月 (60)
2008年11月 (14)
2008年10月 (52)
2008年9月 (64)
2008年8月 (110)
文章分類(lèi)
系統(tǒng)、備份等
UNIX
AIX官方文檔
AIX命令參考大全中文版
DB2 官方
DB2 培訓(xùn)教程
IBM開(kāi)發(fā)者文檔庫(kù)
linuxsir
ODBC
UNIX愛(ài)好者家園
黑客基地
全球最大的黑客門(mén)戶網(wǎng)站
開(kāi)源中國(guó)
信用卡
收單業(yè)務(wù)網(wǎng)
搜索
最新評(píng)論
1.?re: sockaddr_in 結(jié)構(gòu)體在什么頭文件中聲明
一樓正解
--游客游過(guò)
2.?re: update語(yǔ)句的幾種基本用法[未登錄](méi)
12233
--12
3.?re: db2 的事務(wù)時(shí)隱式開(kāi)始的
不更新了嗎
--jason yeung
4.?re: IPC_EXCL 防止key重復(fù)[未登錄](méi)
t
--1
5.?re: DB2 公共表表達(dá)式(WITH語(yǔ)句的使用)[未登錄](méi)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--kk
閱讀排行榜
1.?linux的system () 函數(shù)詳解(79652)
2.?sockaddr_in 結(jié)構(gòu)體在什么頭文件中聲明(50311)
3.?DB2錯(cuò)誤信息(按sqlcode排序)(44566)
4.?update語(yǔ)句的幾種基本用法(33744)
5.?useradd命令詳解(實(shí)例) (32898)
評(píng)論排行榜
1.?設(shè)置OUTLOOK2007新郵件到達(dá)提醒和最小化到托盤(pán)顯示(8)
2.?0.0.0.0的IP是什么地址(8)
3.?報(bào)表工具匯總(7)
4.?sockaddr_in 結(jié)構(gòu)體在什么頭文件中聲明(6)
5.?DB2 中 MQT 的匹配原理及使用技巧(6)
久久亚洲2019中文字幕
|
亚洲AV日韩AV永久无码久久
|
久久99精品久久久久久
|
2021国产成人精品久久
|
伊人久久无码精品中文字幕
|
狠狠色丁香久久婷婷综合_中
|
亚洲国产另类久久久精品小说
|
99久久成人国产精品免费
|
国产成人精品综合久久久
|
精品永久久福利一区二区
|
日产精品久久久久久久性色
|
国产亚洲欧美成人久久片
|
少妇久久久久久被弄到高潮
|
国产美女久久精品香蕉69
|
亚洲国产综合久久天堂
|
大蕉久久伊人中文字幕
|
久久婷婷国产综合精品
|
久久人妻少妇嫩草AV蜜桃
|
久久成人影院精品777
|
久久综合噜噜激激的五月天
|
中文字幕无码av激情不卡久久
|
一本色道久久88加勒比—综合
|
亚洲国产精品成人久久
|
欧美精品九九99久久在观看
|
久久精品国产一区二区三区
|
亚洲国产精品婷婷久久
|
国内精品久久久久影院免费
|
亚洲国产精品无码久久久秋霞2
|
亚洲精品国精品久久99热
|
久久这里有精品视频
|
久久久久九国产精品
|
久久久久香蕉视频
|
久久久久黑人强伦姧人妻
|
久久中文字幕无码专区
|
久久青青国产
|
久久综合久久综合亚洲
|
久久九九兔免费精品6
|
97久久婷婷五月综合色d啪蜜芽
|
日韩欧美亚洲综合久久
|
人妻无码αv中文字幕久久
|
亚洲色大成网站WWW久久九九
|