此代码是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),并且相同的值更新和插入数据,它会产生错误,如何避免它?
答案 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
您需要将两个语句(阅读和更新)放入一个事务中。
这将阻止第二个进程甚至读取值,直到第一个进程完成事务。