Prayer
在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
C#--多进程多线程访问数据库
Posted on 2008-08-26 15:33
Prayer
阅读(1821)
评论(0)
编辑
收藏
引用
所属分类:
数据库,SQL
如何让多进程多线程访问数据库,而不会选择相同的数据,这在设计分布式程序的时候经常用到,多台机器的多个进程,每个进程都有多个线程,每个线程要从数据库里取数据来处理,要实现不能漏取数据,也不能重复取数据,这里给出答案
创建一个数据表,如下,一个自增列,一个表示rss链接地址
CREATE
TABLE
[
dbo
]
.
[
Rss_RssSources
]
(
[
SourceId
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
[
Link
]
[
varchar
]
(
1024
)
NOT
NULL
)
ON
[
PRIMARY
]
先放1w条数据
declare
@i
int
set
@i
=
1
while
@i
<
10000
begin
select
@i
=
@i
+
1
insert
into
[
Rss_RssSources
]
values
(
newid
())
end
再创建一个锁表,一个字段表示是否已经锁定的资源,另一个表示已经读取的rss源的最大id
create
table
Rss_RssSourceLock
(
IsLock
bit
,
MaxSourceId
int
)
初始化数据
insert
into
Rss_RssSourceLock
values
(
0
,
0
)
下面我们要设计一个存储过程,让这个存储过程每次返回10个rss源,知道返回所有的rss源,要求无遗漏,无重复返回。如下
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、如果锁表里显示没有进程正在读取rss源(IsLock = 0),那么就返回从最大的rss源id往后的10个rss源,否则返回空。
2、 用with(READPAST)表示忽略锁住的行,如果另一个进程正在执行update Rss_RssSourceLock的语句,并且在事务提交前,update语句会锁住这些要更新的行,而Rss_RssSourceLock表就一行数 据,这时候select Rss_RssSourceLock表并且忽略被锁的行肯定是没数据的,所以本次存储过程执行会返回空。
3、begin tran和commit tran保证了即使本次存储过程出错,也不会让Rss_RssSourceLock表处于IsLock = 1的脏数据状态,如果处于这种状态,后面的进程执行存储过程就永远也返回不了数据了。
4、因为有时候一次选取的记录可能不够10条,所以这里用了个临时表来暂存记录,再算出来选取的条数,最后更新Rss_RssSourceLock表的MaxSourceId字段。但用临时表肯定会增加数据库的压力,这里不知道用表变量是不是会改善性能,暂时先这样了。
5、应用里调用这个存储过程,如果返回了数据,就进行处理,如果没返回数据,就sleep几秒才执行,直到返回数据。
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
两阶段提交
主键与唯一索引
DB2 Merge语句
LDAP
三十五个非主流开源数据库 MongoDB领衔主演
系统临时表使用问题
WITH HOLD
事务--<
>
MINUS EXCEPT
OLAP与OLTP的一些基础知识
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
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
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(28)
给我留言
查看公开留言
查看私人留言
随笔分类
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基础管理(12)
计算机基础(4)
金融相关(66)
面向对象(10)
日常技巧(99)
数据库,SQL(101)
算法(6)
系统、备份等(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)
文章分类
系统、备份等
UNIX
AIX官方文档
AIX命令参考大全中文版
DB2 官方
DB2 培训教程
IBM开发者文档库
linuxsir
ODBC
UNIX爱好者家园
黑客基地
全球最大的黑客门户网站
开源中国
信用卡
收单业务网
搜索
最新评论
1. re: sockaddr_in 结构体在什么头文件中声明
一楼正解
--游客游过
2. re: update语句的几种基本用法[未登录]
12233
--12
3. re: db2 的事务时隐式开始的
不更新了吗
--jason yeung
4. re: IPC_EXCL 防止key重复[未登录]
t
--1
5. re: DB2 公共表表达式(WITH语句的使用)[未登录]
评论内容较长,点击标题查看
--kk
阅读排行榜
1. linux的system () 函数详解(79583)
2. sockaddr_in 结构体在什么头文件中声明(50221)
3. DB2错误信息(按sqlcode排序)(44450)
4. update语句的几种基本用法(33594)
5. useradd命令详解(实例) (32862)
评论排行榜
1. 设置OUTLOOK2007新邮件到达提醒和最小化到托盘显示(8)
2. 0.0.0.0的IP是什么地址(8)
3. 报表工具汇总(7)
4. DB2 中 MQT 的匹配原理及使用技巧(6)
5. sockaddr_in 结构体在什么头文件中声明(6)