回答

收藏

即使事务回滚,SQL身份(自动编号)也会增加

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

我有一个带有SQL插入SQL Server 2005数据库的.net事务。该表具有一个身份主键。
2 g; ~* b, N( Y1 t' c- `% h- y当事务内发生错误时,将Rollback()被调用。行插入将正确回滚,但是,下次我将数据插入表时,标识将增加,就好像从未发生过回滚一样。因此,本质上在同一性序列中存在缺口。有什么方法可以让该Rollback()方法回收丢失的身份?
! l0 k+ y% b' B  }, e" }2 j我不是用正确的方法吗?: o2 g' Q! P3 F5 Q8 m* ?; L+ X! H
                # @, [; C3 }6 M
解决方案:% ^8 ~/ b' ?& ?2 O0 j- U5 H# ~% R
               
9 }/ O8 M0 h$ S. a2 s" @, o
& u; o% U9 [. W, D% t4 G  F0 ]  a7 I" ?! z
                如果您考虑一下,则自动递增号 不应
- h" S" e/ u: K( a9 Y" }9 e- @' F+ a7 c6 t是事务性的。如果其他事务必须等待以查看是否要使用或“回滚”自动编号,则使用该自动编号的现有事务将阻止它们。例如,考虑下面我的表A的伪代码,对ID列使用一个自动编号字段:. i1 G" g2 `7 |9 S+ i8 e
User 14 Z% S" m2 N, L0 L* R) ~/ U
------------
5 O( \: \2 g/ u- ^- xbegin transaction
/ h1 \$ a, y9 ?* c2 k& y; tinsert into A ...$ B5 D$ R1 Y9 M3 m3 T
insert into B ...
, q% @% E& R/ u* Gupdate C ...  S& D! [" l  v! D' o
insert into D ...4 X! o6 j0 I, k9 J/ N0 c
commit, n3 w, j7 u/ H( E

( `+ n' B1 l8 F" V& V4 G$ mUser 2
# A# |2 ^+ J5 X, r2 c: `* l-----------
8 k& T# ?( }) ?8 ]begin transaction
( M- E4 ~0 q& R8 S; cinsert into A ...
6 @9 V1 C# D1 ?) r, yinsert into B ...' V! R8 ~1 p2 Y! D% _  x
commit
" s/ a# a. y& Y& c% I如果用户2的事务在用户1的事务之后一毫秒开始,那么他们向表A的插入将不得不等待用户1的整个事务完成,以查看是否使用了从第一次插入A的自动编号。) A4 f4 c# W( I* |
这是一个功能,而不是错误。如果您需要自动编号,我建议使用另一种方案来生成自动编号。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则