我有一个插入表的存储过程(其中有一个不是主键的标识列 - 最初使用日期/时间插入PK来生成唯一值)。
然后我们使用SCOPEIDENTITY()来获取插入的值,然后根据此值生成主键字段值,然后将其更新回表。
在某些情况下,存储过程由多个进程同时调用,导致“违反PRIMARY KEY约束...”错误。
这似乎表明标识列允许为多个记录插入相同的数字。
第一个问题 - 这怎么可能?
第二个问题 - 如何阻止它...目前没有错误处理因此我将添加一些try / catch逻辑 - 但是想要完全理解问题以正确处理
答案 0 :(得分:2)
更仔细地查看错误消息:
违反 PRIMARY KEY 约束......
鉴于你说:
如果标识列不是主键 - 最初使用日期/时间插入PK以生成唯一值
我认为问题与标识列无关,因为它不是主键,但更有可能日期/时间方法不生成唯一值,尝试插入时失败。
是否有一些原因您不仅仅使用标识列作为主键?
答案 1 :(得分:1)
我认为,您应该使用 IDENT_CURRENT('tablename')。
SCOPE_IDENTITY(),将返回当前会话中创建的最后一个标识值。
IDENT_CURRENT 不受范围和会话的限制;它仅限于指定的表格。
您可以在这里阅读有关您的问题的信息
和另一篇关于并行性的有用文章
https://sqlblog.org/2009/03/21/six-reasons-you-should-be-nervous-about-parallelism
祝你好运!
答案 2 :(得分:0)
最初使用日期/时间插入PK以生成唯一值
你确定这是造成问题的身份吗?如果您将当前日期/时间值作为PK的初始值插入,并且它同时由2个不同的线程/进程执行,则您可能获得相同的值。