如何避免高度并发更新主键错误?

时间:2013-10-28 01:21:55

标签: sql sql-server

此代码是SQL Server 2008中的存储过程:

select @pkvalue = maxkey + 1, @id = id
from dbo.sys_maxkey
where tablename = UPPER(@tablename) and keyname = UPPER(@fieldname) and ds_id = @ds_id   

update dbo.sys_maxkey with (updlock)
set maxkey = maxkey + 1
where id = @id  

这段代码获取一个主键,它从存储了所有表的最大主键的表中找到最大键,但它有一个问题,当并发性很高时,也许两个人都会同时读取一行(即使我们添加uplock),并且相同的值更新和插入数据,它会产生错误,如何避免它?

1 个答案:

答案 0 :(得分:1)

您可以在select

中使用独占锁读取值
select @pkvalue=maxkey+1,@id=i
from dbo.sys_maxkey with (xlock)
where tablename=UPPER(@tablename) and keyname=UPPER(@fieldname) and ds_id=@ds_id 

您需要将两个语句(阅读和更新)放入一个事务中。

这将阻止第二个进程甚至读取值,直到第一个进程完成事务。