求解决SQL锁的问题!!!!
现在有存储过程,其要求是读出表中单号,并加1后再写回数据库。为了因为会有并发,所以加锁了,但在使用过程中发现非常容易出现死锁情况。请问如何解决??
单号是日期加上流水号(200507060001),因已上线使用,不能做大的改动。并发数一秒钟之内不会大于50的。
CREATE PROCEDURE ReadDh @yijbm varchar(3),@erjbm varchar(3),@sajbm varchar(3),@sijbm varchar(4),
@TableName varchar(20),@FieldName varchar(10),@NewDh varchar(12) Output,@State integer output
AS
--@State变量,0成功,1失败,2服务器时间小于单号时间
--服务器上现在时间
Declare @NowDate char(8)
--Dh单号,DhDate单号中的时间
Declare @Dh varchar(12),@DhDate char(8)
--生成语句的变量
Declare @Strtmp nvarchar(4000)
--生成服务器的时间。
Set @NowDate=Convert(Char(8),Getdate(),112)
SET DEADLOCK_PRIORITY normal
SET LOCK_TIMEOUT 6000
--找出单号
BEGIN TRANSACTION UpdateDh
Set @Strtmp='Select @Dh='+@FieldName+' From '+@TableName+' XLock Where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+''' and sijbm='''+@sijbm+''''
exec sp_executesql @Strtmp,N'@dh varchar(12) out',@dh out
--生成单号时间
Set @DhDate=left(@Dh,8)
If @NowDate>=@DhDate
Begin
If @NowDate>@DhDate
Set @Dh=@NowDate+'0001'
Else
Set @Dh=@NowDate+Right('0000'+LTRIM(Str(Right(@Dh,4)+1)),4)
--更新
Set @Strtmp=' Update '+@TableName+' Set '+@FieldName+'='''+@Dh+''' where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+''''
Set @Strtmp=@Strtmp+' and sijbm='''+@sijbm+''''
Set @Strtmp=@strtmp+' WaitFor delay ''00:00:02'''
exec sp_executesql @Strtmp,N'@dh varchar(12) ',@dh
if @@ERROR<>0
Begin
ROLLBACK TRANSACTION UpdateDh
--更新单号失败
Set @State=1
Set @NewDh=@Dh
Return
End
--更新成功
Set @NewDh=@Dh
Set @State=0
End
Else
--服务器时间小于单号时间
Set @State=2
COMMIT TRANSACTION UpdateDh
GO