更新的奇怪问题,SQL Server 2000(在线等待)

acersoft 2003-11-18 08:19:03
表A存放种子,就一个字段id, int类型,也只有一笔数据20
假定现在程序做一个100次的循环,调用一个存储过程
该过程的主要功能如下,每次都要先更新表A set id=id+1,然后再取ID的数据
代码如下
declare @tmpid bigint
declare @tmpstr varchar(20)
set @tmpstr=''
set @tmpid=0
update a set id=id+1
select @tmid=id from a readcommitted
set @tmpstr= ltrim(rtrim(convert(varchar,@tmpid)))
print @tmpstr
现在发现这样的问题
tmpstr的数据很奇怪,按道理应该是21,22,23,24这样一直下来
可结果有时候是这样,21,22,22,24,23就没有了,直接到24了。
如果调用该过程的循环次数少的话,这种情况很少,如果循环次数多的话,1000笔资料就有10笔出现这样的情况。
我现在不知道为什么会出现这样的情况,估计是数据脏读。因为的确有很多人同时对这个表做处理,有没有好的解决办法,或者保险点的事务处理方法。。现在还没能回家,加班啊,饭都没吃。唉,救急。。。
...全文
36 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
真是奇怪的问题.
pengdali 2003-11-18
  • 打赏
  • 举报
回复
1 如何锁一个表的某一行


A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

update tablename set colname='10' where id=3 --则要等待5秒

update tablename set colname='10' where id<>3 --可立即执行

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)


注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
acersoft 2003-11-18
  • 打赏
  • 举报
回复
程序不是问题,关键是结果有问题。。。
pengdali 2003-11-18
  • 打赏
  • 举报
回复
declare @tmpid bigint
begin tran
update a set id=id+1
select @tmid=id from a
commit tran
print @tmpid
pengdali 2003-11-18
  • 打赏
  • 举报
回复
declare @tmpid bigint
declare @tmpstr varchar(20)
set @tmpstr=''
set @tmpid=0
update a set id=id+1
select @tmid=id from a
set @tmpstr=@tmpid
print @tmpstr

有什么问题??
acersoft 2003-11-18
  • 打赏
  • 举报
回复
没办法,老规矩,自己顶一下先。分数不是问题。多谢多谢。。

34,681

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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