2010-03-27 109 views
3

我有一个SqlServer 2008表具有一个主键(IsIdentity =是)和三个其他字段组成一个唯一键约束。主键身份价值增量在唯一键约束违规

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

C#的存储过程调用工作正常,但是当C#存储过程调用违反唯一键约束我已经注意到有趣的结果....

当存储过程调用违反唯一键约束,则抛出SQLException - 这并不令人惊讶和冷静。但是,我注意到下一个成功添加到表中的记录的PK值并不比之前的记录多一个 -

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

这是正常行为吗?如果是这样,你能给我一个这样的原因吗? (如果记录未能插入,为什么PK指数会递增?)

如果这不是正常行为,您能否给我提示我为什么会看到这些症状?

回答

6

是的,这是正常的。

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

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

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

+0

是的,你永远不能指望标识字段永不跳过值。 – HLGEM 2010-08-23 21:04:10