2

此代码是 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),和相同的值更新插入数据,报错,如何避免?

4

1 回答 1

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 

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

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

于 2013-10-28T01:31:35.027 回答