gpt4 book ai didi

sql-server - SQL Server SCOPE_IDENTITY() - 线程安全

转载 作者:行者123 更新时间:2023-12-04 01:01:47 24 4
gpt4 key购买 nike

我们必须修改我们的数据库并自己管理 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 时立即增加,而不仅仅是在提交事务时。这会导致身份序列在事务回滚时出现间隙,但那是因为它在您描述的那种情况下完全保证安全。

关于sql-server - SQL Server SCOPE_IDENTITY() - 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com