欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

存储过程并发访问促成脏数据求解

更新时间: 2014-01-05 02:17:48 责任编辑: Author_N1

 

存储过程并发访问造成脏数据求解
环境:SQL SERVER2005存储过程。
问题:2个存储过程中都有一段语句,语句为:
declare @maxnum int;
declare @danjutou varchar(10);
declare @maxdanju varchar(20);
BEGIN TRANSACTION
Begin
select @maxnum=maxnum from a where id=112;   ----标志1
select  @danjutou=danjutou from b where id=888;
set @maxdanju=@danjutou+@maxnum;
update a set maxnum=@maxnum+1 where id=112;  ---标志2
update c set fnumber=@maxdanju where id=***;
End
commit TRANSACTION

A表中的maxnum值是单据号的最大值。因为存储过程调用太频繁,造成2个存储过程同时通过--标志1取@maxnum,然后操作标志2的时候数据出错。造成c表中的fnumber出现重复,求解。谢谢
--参考方法--
c表中的fnumber出现重复,因为2个过程都同时执行,获取的maxnum和danjutou值都一样,所以才重复。
你的隔离级别是0 ?
--参考方法--
你两个程序都用id=112这个?
--参考方法--
改成这样试试:

declare @maxnum int;
declare @danjutou varchar(10);
declare @maxdanju varchar(20);
BEGIN TRANSACTION
Begin
/*
select @maxnum=maxnum from a where id=112;   ----标志1
select  @danjutou=danjutou from b where id=888;
set @maxdanju=@danjutou+@maxnum;
*/
update a set maxnum=(select maxnum from a where id=112)+1 where id=112;  ---标志2
update c set fnumber=(select maxnum from a where id=112)+ 
                     (select danjutou from b where id=888)
where id=***;
End
commit TRANSACTION
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:17:48
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/8147/
本文WWW.DOC100.NET DOC100.NET版权所有。