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