此代码是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 这段代码是获得一个主键,它从存储了所有表的最大主键的表中找到最大键,但是它有一个问题,当并发性很高时,可能会有两个人同时读取一行(即使我们添加了上行锁),以及相同的值更新和插入数据,它会产生错误,如何避免它?
发布于 2013-10-28 01:31:35
可以在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 您需要将这两个语句(读取和更新)放在一个事务中。
这将阻止第二个进程甚至读取值,直到第一个进程用事务完成为止。
https://stackoverflow.com/questions/19625845
复制相似问题