我们必须修改数据库并自己管理 IDENTITY 列(而不是依赖于 auto-inc 字段)。
我们的解决方案是有一个“生成器”表,其中有一个 auto-inc 字段。我们插入到该表中,然后读取 SCOPE_IDENTITY 值以获取新的 ID,例如
insert into NewIDEntity
(CreationDate)
select
GetDate()
select @EntityID = SCOPE_IDENTITY()
我们主要关心以下场景:
• 事务1 INSERTS 到NewID 中并接收101 作为要插入到实体表中的新ID。
• 在提交之前,事务 2 插入 NEWID 并接收 101 作为新 ID(这是因为 SCOPE_IDENTITY() 将返回当前作用域上下文中的 ID。原始行尚未提交,因此我们期望值为 101)
• 事务1 提交并且该行被写入。
• 事务2 尝试提交,但101 已被写入,导致主键冲突并中止事务。
然而,在运行此命令时,SCOPE_IDENTITY() 似乎是由 SQL Server 处理的,即使在 READ UNCOMMITTED 隔离级别下运行,我们也不会遇到冲突。
这可以吗?还是有我们无法找到的问题?
谢谢
邓肯
身份生成本质上不属于任何事务的范围 - ID 计数器总是在 ID 生成后立即增加,而不仅仅是在提交事务时。这会导致身份序列在事务回滚时出现间隙,但这是因为它在您描述的那种情况下保证了安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)