SQL Server SCOPE_IDENTITY() - 线程安全

Dun*_*can 2 sql-server identity

我们必须自己修改数据库并管理IDENTITY列(而不是依赖于auto-inc字段).

我们的解决方案是有一个"生成器"表,它有一个auto-inc字段.我们插入此表,然后读取SCOPE_IDENTITY值以获取我们的新ID,例如

insert into NewIDEntity
        (CreationDate)
        select
        GetDate()

select @EntityID = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

我们主要关注以下场景:

•事务1 INSERTS进入NewID并接收101作为要插入实体表的新ID.
•在它可以提交之前,将事务2 INSERTS转换为NEWID并且还接收101作为新ID(这是因为SCOPE_IDENTITY()将在当前范围的上下文中返回ID.原始行尚未提交,因此我们期望值为101)

•事务1提交并写入行.
•事务2尝试提交但已写入101并导致主键违规并中止事务.

但是在运行时,似乎SCOPE_IDENTITY()由SQL Server处理,即使在READ UNCOMMITTED隔离级别下运行,我们也不会发生冲突.

这没关系,还是我们找不到的东西?

谢谢邓肯

ara*_*nid 7

身份生成基本上不在任何事务的范围内 - 一旦生成ID,ID计数器总是会受到冲击,而不仅仅是在提交事务时.这导致身份序列在事务回滚时存在间隙,但这是因为它确保了您所描述的那种情况下的安全性.