日期:2014-05-17  浏览次数:20489 次

存储过程并发访问造成脏数据求解
环境: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