求解决SQL锁的问题!!!!

icemanpro 2005-07-06 05:24:01
现在有存储过程,其要求是读出表中单号,并加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
...全文
115 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
vivianfdlpw 2005-07-06
  • 打赏
  • 举报
回复
INF: 了解和解决 SQL Server 7.0 或 2000 阻塞问题
http://support.microsoft.com/kb/224453/zh-cn

如何监视 SQL Server 2000 阻塞
http://support.microsoft.com/kb/271509/zh-cn

34,576

社区成员

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

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