2

假设我有以下

Begin Tran

Insert Into tbl(name) values('name1');

Insert Into tbl(name) values('name2');


Rollback

End

tbl有一个标识列 (id) 和一个 varchar 列 (name)。

现在显然数据将被回滚。

当我再次尝试插入记录时,Id 列的值为 3 而不是 1!

为什么?为什么 Identity 列值不参与交易?它存储在哪里?等等

好吧,我已经阅读了这个以及这个,但我仍然需要更深入的信息。

提前致谢

4

2 回答 2

3
T1:                      |  T2
begin                    |  begin     
insert <-- gets ID 1     |
                         |    insert <-- gets ID 2
rollback                 |

现在,只有当您可以回答如果 id 生成“参与事务”时 T1 回滚后下一个 ID 应该是什么值......

于 2013-04-03T10:22:22.180 回答
1

您可以检查MSDN本身:

...“值的重用 – 对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。如果特定的插入语句失败或插入语句回滚,则使用的身份值将丢失并且不会再次生成。这可能会导致后续身份值生成时出现间隙。”

“这些限制是为了提高性能而设计的一部分,并且因为它们在许多常见情况下都是可以接受的。如果由于这些限制而无法使用标识值,请创建一个单独的表来保存当前值并管理对表的访问和与您的申请一起分配号码。”

而且我认为简单的原因是种子没有为该列设置,因为它的生成方式如下:

每个新值都是根据当前种子和增量生成的

更改seed值可能会导致并发插入更加混乱,并且与UNIQUEor结合使用PRIMARY KEY,并且 insert 可能更容易“死亡”,特别是在事务繁重的环境中。

于 2013-04-03T10:23:21.973 回答