假设我有以下
Begin Tran
Insert Into tbl(name) values('name1');
Insert Into tbl(name) values('name2');
Rollback
End
表 tbl 有一个标识列(id)和一个varchar列(名称)。
现在显然数据将被回滚。
当我再次尝试插入记录时,Id列值为3而不是1!
为什么呢?为什么Identity列值没有参与事务?它存放在哪里?等
提前致谢
答案 0 :(得分:3)
T1: | T2
begin | begin
insert <-- gets ID 1 |
| insert <-- gets ID 2
rollback |
现在,只有在T1回滚后,如果id生成'参与交易',你才能回答下一个ID 的值<...
答案 1 :(得分:1)
您可以查看MSDN本身:
... “重复使用值 - 对于具有特定身份的给定身份属性 种子/增量,引擎不会重用标识值。如果一个 特定的insert语句失败或者插入了insert语句 那么消耗的身份值就会丢失而不会丢失 再次生成。这可能导致后续身份时出现间隙 生成值。 “
“这些限制是设计的一部分,以便改进 性能,因为它们在许多常见的情况下是可以接受的 的情况。如果因为这些而无法使用标识值 限制,创建一个包含当前值的单独表格 管理对表的访问和编号分配 应用“。
我认为原因很简单,种子不会因为那个柱子而退缩,因为它的生成方式如下:
每个新值都是根据当前种子生成的。增量
更改seed
值可能会导致并发插入更多混乱,并且与UNIQUE
或PRIMARY KEY
结合,插入可能更容易“死”,特别是在交易繁重的环境中。