sql server rollback

时间:2010-10-21 15:43:02

标签: sql sql-server tsql sql-server-2008 rollback

  

可能重复:
  SQL Identity (autonumber) is Incremented Even with a Transaction Rollback

回滚也会回滚标识值???

4 个答案:

答案 0 :(得分:6)

不,它不应该......

身份的产生必须在交易之外,否则就不会起作用。

答案 1 :(得分:3)

回滚不会重置种子值(这意味着身份值会有间隙)。

示例:如果插入5行,其标识值为:

5, 6, 7, 8, 9

并进行回滚,下一个标识值仍为10,即使缺少5 - 9。

答案 2 :(得分:3)

不,并且有充分的理由。假设有两个事务处于活动状态,每个事务都使用相同的身份。假设事务1抓取数字(1,3,4,7,9)和事务2抓取(2,5,6,8)。然后回滚事务2。身份应该回滚到什么地方?如果重置标识以使“下一个”值是事务分配的第一个或最后一个值,那么从标识中获取数字的下一个程序在尝试使用该数字时可能会遇到某些类型的密钥违规。因此,身份编号分配不会被转移。

分享并享受。

答案 3 :(得分:2)

不,你不希望它重复使用它们。绝不应假定身份没有间隙(它们也不会被重复用于删除)。

差距也不应该对任何人都有影响。如果有人要求提供此功能,则说明需要进行大量且昂贵的更改才能手动创建ID,并且由于竞争条件的原因,此更改将面临很多数据完整性问题的风险。此外,这种昂贵且有风险的变化绝对不会产生任何收益。系统将工作得更慢(如果你要填补空白,手动生成id需要更长的时间),如果你重复使用已删除的ID并且有些子记录因为其他人而没有被删除,则存在很大的风险。以为正式执行PK / FK关系是一个坏主意(或者只是错过了一张桌子)。这是我个人不接受的要求。这对数据来说太危险了。