我有一个 SqlServer 2008 表,它有一个主键 (IsIdentity=Yes) 和其他三个组成唯一键约束的字段。

此外,我有一个存储过程,可将记录插入表中,并使用 SqlConnection 对象通过 C# 调用 sproc。

C# sproc 调用工作正常,但是当 C# sproc 调用违反唯一键约束时,我注意到了有趣的结果......

当 sproc 调用违反唯一键约束时,会抛出 SqlException - 这并不奇怪而且很酷。但是,我注意到成功添加到表中的下一条记录的 PK 值并不比前一条记录多一个 -

例如:假设该表有五个记录,其中 PK 值为 1、2、3、4 和 5。 sproc 尝试插入第六条记录,但违反了唯一键约束,因此第六条记录不是插入。然后 sproc 尝试插入另一条记录,这次它成功了。 - 这条新记录的 PK 值为 7,而不是 6。

这是正常行为吗?如果是这样,你能告诉我为什么会这样吗? (如果一条记录插入失败,为什么PK索引会增加?)

如果这不是正常行为,您能否就我看到这些症状的原因给我任何提示?

最佳答案

是的,这是正常的。

想象一下这里发生的事务,这是在 SQL Server 上运行的潜在操作顺序。

  • 使用了 ID 1、2、3、4、5。
  • 客户端 A 开始事务。
  • 客户端 A 执行插入但不提交(ID 6)。
  • 客户端 B 开始事务。
  • 客户端 B 执行插入但不提交。 (ID 7)。
  • 客户端 A 回滚。
  • 客户端 B 提交。

  • 由于这种行为的可能性(不一定存在),您会看到当插入失败时 ID 6 被跳过。

    关于sql - 违反唯一键约束的主键标识值增加,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2530339/

    10-12 05:29