为什么Identity Columns不参与交易?

时间:2013-04-03 09:59:46

标签: sql-server

假设我有以下

Begin Tran

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

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


Rollback

End

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

现在显然数据将被回滚。

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

为什么呢?为什么Identity列值没有参与事务?它存放在哪里?等

我已阅读this以及this,但我仍需要更深入的信息。

提前致谢

2 个答案:

答案 0 :(得分:3)

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

现在,只有在T1回滚后,如果id生成'参与交易',你才能回答下一个ID 的值<...

答案 1 :(得分:1)

您可以查看MSDN本身:

  

...   “重复使用值 - 对于具有特定身份的给定身份属性   种子/增量,引擎不会重用标识值。如果一个   特定的insert语句失败或者插入了insert语句   那么消耗的身份值就会丢失而不会丢失   再次生成。这可能导致后续身份时出现间隙   生成值。 “

     

“这些限制是设计的一部分,以便改进   性能,因为它们在许多常见的情况下是可以接受的   的情况。如果因为这些而无法使用标识值   限制,创建一个包含当前值的单独表格   管理对表的访问和编号分配   应用“。

我认为原因很简单,种子不会因为那个柱子而退缩,因为它的生成方式如下:

  

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

更改seed值可能会导致并发插入更多混乱,并且与UNIQUEPRIMARY KEY结合,插入可能更容易“死”,特别是在交易繁重的环境中。