回答

收藏

唯一键限制违规增加主键标识值

技术问答 技术问答 178 人阅读 | 0 人回复 | 2023-09-13

我有一个SqlServer 2008表,主键(IsIdentity = Yes)构成唯一键约束的其他三个字段。
4 ]7 C$ b0 L0 T此外,我还有一个存储过程,它将记录插入表并使用SqlConnection对象通过C#调用了sproc。
4 Q3 H9 [8 [- D, `( FC#sproc调用工作正常,但当C#sproc调用违反唯一键约束…我注意到了有趣的结果。
7 i2 O, y/ r* r. @- n1 v4 j当sproc调用违反唯一键约束时,会造成SqlException-
8 N4 ~$ D, O: `' @5 u) y8 a" d+ k这并不令人惊讶和酷。但是,我注意到下一个记录成功添加到表中。PK与上一条记录不完全相同-: Z( O7 h, S, N8 H- ?
例如,该表有五个记录,其中包括PK值分别为1、2、3、4和5。试着在存储过程中插入第六条记录,但它违反了唯一的键限制,因此没有插入第六条记录。已插入。然后,试着在存储过程中插入另一个记录,这次它成功了。-此新记录的PK值为7,而非6。
/ B0 Z6 O/ [$ Q$ c  }+ n这是正常行为吗?如果是这样,你能给我一个理由吗?(如果记录不能插入,为什么?PK索引增加?)
& P$ l  Q' s" q$ I% N假如这不是正常的行为,你能给我一些提示为什么我看到这些症状吗?0 u% f! a- H. ]! e- [6 i
                                                               
% b- O  K0 {( f' R    解决方案:                                                                0 q9 R4 j. @1 T3 o
                                                                是的,这很正常。4 D1 I, K9 ^- `& H- F9 j& s: C( x
想象一下这里正在做的事情,这是SQL Server潜在的操作顺序。# f4 W1 x" n, c! g/ P1 o
[ol]使用ID 1、2、3、4、5。9 j# t( `% w7 B) w  W: x: P
客户A开始交易。
4 Y- w2 l/ j" y: ^7 }客户端A但不提交执行插入(ID 6)。
' X& B" R1 {/ t; F) `* A/ h客户B开始交易。. W% I2 z1 X) G0 k' `8 c5 y4 O
客户端B但不提交执行插入。(ID 7)。
- u- d& S; `. i3 P客户端A回滚。% b' a3 {, T+ F8 a  |4 E) B
客户B提交。[/ol]当插入失败时,你会看到这种行为的可能性(不一定存在)ID 6被跳过。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则