首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免高度并发更新主键错误?

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

Stack Overflow用户
提问于 2013-10-28 01:21:55
回答 1查看 271关注 0票数 2

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

代码语言:javascript
复制
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  

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 01:31:35

可以在select中使用独占锁读取值。

代码语言:javascript
复制
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 

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19625845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档