SQL Server SCOPE_IDENTITY()-线程安全

| 我们必须修改数据库并自己管理IDENTITY列(而不是依赖于auto-inc字段)。 我们的解决方案是创建一个\“ Generator \”表,该表具有一个auto-inc字段。我们插入到此表中,然后读取SCOPE_IDENTITY值以获取新ID,例如
insert into NewIDEntity
        (CreationDate)
        select
        GetDate()

select @EntityID = SCOPE_IDENTITY()
我们主要关注以下情况: •将事务1插入到NewID中,并接收101作为要插入到实体表中的新ID。  •在提交之前,事务2将插入到NEWID中,并且还接收101作为新ID(这是因为SCOPE_IDENTITY()将在当前作用域的上下文中返回该ID。原始行尚未提交,因此我们希望值为101) •事务1提交并写入行。 •事务2尝试提交,但是已经写入101,并导致主键冲突,并中止了事务。 但是,在运行此命令时,似乎SCOPE_IDENTITY()由SQL Server处理,即使在READ UNCOMMITTED隔离级别下运行,我们也不会发生冲突。 可以吗?还是我们找不到找不到的陷阱? 谢谢 邓肯     
已邀请:
身份生成本质上不在任何事务处理的范围之内-ID计数器总是在生成ID后立即发生碰撞,而不仅仅是提交事务时。这会导致身份序列在事务回滚时具有缺口,但这是因为它在您描述的那种情况下保证了安全性。     
我同意Araqnid的回答,但更好的一点是,除非您想保留生成的ID的历史记录,否则也可以在完成后将其删除。我们还有一个业务需求,即以一种特定的方式(以其他值作为前缀)生成ID,而我这样做的方式是拥有一个仅包含标识字段的表。然后我的代码如下所示:
/*
 * There is no \"user data\" being added to the table, so we just use
 * \"Default Values\".
 */
Insert  Into dbo.MasterIds Default Values

Set @MasterId = Scope_Identity()

/*
 * We don\'t keep just serial numbers on this table. Now that we have
 * the new MasterId delete it from the table.
 */
Delete  From dbo.MasterIds
Where   MasterId = @MasterId

Select  @MasterId As MasterId
希望能有所帮助。     

要回复问题请先登录注册