并发读取同一表记录

holyten 2004-05-11 09:21:36
系统描述: Windows2000+SQLServer2000; 50个以上的连接(ADO)

问题描述: 表1个 字段(*CID,OWNER,FIELD1,FIELD2,...,STATUS)*表示主键

如果50个连接要求的都是从该表读1条STATUS=0的记录,但是不能有重复,也就是说每个连接只能读1条记录的内容,并保证别的连接是读不到的。在取出记录后,处理完后就UPDATE STATUS=1,然后继续读新的一条记录。依次类推。(当然在读数据的时候连接是使用存储过程读的)

问题出现: 当有1000000条记录,50个连接同时开始读的时候.......速度慢了点
当最后只有20条左右STATUS=0的记录的时候............有死锁现象

寻求一种高效的解决办法。
...全文
74 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2004-05-11
  • 打赏
  • 举报
回复
--参考这个

--处理示例
http://expert.csdn.net/Expert/topic/2921/2921334.xml?temp=.2235376

--在表中增加几个字段:
read_time --读取记录的时间
host_name --读取记录的电脑名称
read_user --读取记录的操作员


--在 CSDNM 的基础上修改(结合两种方法)后的示例

create proc 提取记录
@read_user char(20) ---审核者
as
declare @id int

BEGIN TRANSACTION
--从本机,本人读取的记录中取
select top 1 @id=id from tablename with (UPDLOCK)
where 某字段=2
and [host_name]=host_name()
and read_user=@read_user
order by time

if @@rowcount=0 --如果没有,从没有被读取的记录中读取
begin
select top 1 @id=id from tablename with (UPDLOCK)
where 某字段=2
and(host_name is null
or read_user is null)
order by time

if @@rowcount=0 --如果没有,从超时的记录中读取
begin
select top 1 @id=id from tablename with (UPDLOCK)
where 某字段=2
and read_time<datediff(hout,-1,getdate()) --假设超时时间为1小时
order by time

if @@rowcount=0 --无记录退出
begin
commit tran
return
end
end
end

update tablename set
read_user=@read_user,
[host_name]=host_name(),
read_time=@read_time
where id=@id
commit transaction
select * from tablename where id=@id
go


JonathanLee 2004-05-11
  • 打赏
  • 举报
回复
先UPDATE再SELECT会好一些

UPDATE就会给记录上锁的

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧