gpt4 book ai didi

c# - 如果我在多个同时查询中使用 IsolationLevel.Snapshot 进行事务查询,SELECT @@IDENTITY 将返回什么?

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:55 25 4
gpt4 key购买 nike

我有多个应用程序通过多个事务访问一个表,我希望这些多个应用程序/事务能够让执行该事务的应用程序相应地插入每个主键/身份。出于某种原因,我不能使用 SCOPE_IDENTITY,这就是为什么我最后选择使用 @@IDENTITY。对于事务查询,我为每个事务实现了 IsolationLevel.Snapshot 以避免阻塞。

现在我的问题是,在这种情况下,每个事务是否会正确并相应地返回 @@IDENTITY

例。我同时执行三个查询:

  • Transactional1 查询插入,预期返回 Identity 100;
  • Transactional2 查询插入,预期返回 Identity 102;
  • Transactional3 查询插入,预期返回标识 103;

它会像这样相应地返回Identity吗? 这是我的目标

  • 交易 1 - 100
  • 交易 2 - 102
  • 交易 3 - 103

或者它可能会这样发生? 这是我害怕发生的事情

  • 交易 1 - 102
  • 交易 2 - 103
  • 交易 3 - 101

这个现有的触发器是 SCOPE_IDENTITY 确实返回身份的原因,即使我的代码和查询中有 SCOPE_IDENTITY。

ALTER trigger [dbo].[CustomerAddressesInsertVIds] on [dbo].[CustomerAddresses]
instead of insert
as
begin
set nocount on
insert into [dbo].[CustomerAddresses]
([CustomerID], [AddressTypeID], [CustomerAddressID], [AddressNameType], [Name], [ContactID], [Address1], [Address2], [Address3], [City], [County], [State], [Country], [Zip], [Phone1], [Phone2], [Fax1], [Fax2], [CreateDate], [CreateUser], [MaintenanceDate], [MaintenanceUser], [LastOrderDate], [DeleteOnDate], [SyncStatus], [SyncDate], [SyncUser], [ERPID], [CreateCustomerID], [CreateContactID], [MaintenanceCustomerID], [MaintenanceContactID], [Active], [Deleted], [LockUser], [LockSessionID], [LockDate], [InUse], [AddressTypeVId], [CustomerVId])
select
coalesce([CustomerID], (select [CustomerID] from [dbo].[Customers] where [CustomerVId]=inserted.[CustomerVId])), coalesce([AddressTypeID], (select [AddressTypeID] from [dbo].[AddressTypes] where [AddressTypeVId]=inserted.[AddressTypeVId])), [CustomerAddressID], [AddressNameType], [Name], [ContactID], [Address1], [Address2], [Address3], [City], [County], [State], [Country], [Zip], [Phone1], [Phone2], [Fax1], [Fax2], [CreateDate], [CreateUser], [MaintenanceDate], [MaintenanceUser], [LastOrderDate], [DeleteOnDate], [SyncStatus], [SyncDate], [SyncUser], [ERPID], [CreateCustomerID], [CreateContactID], [MaintenanceCustomerID], [MaintenanceContactID], [Active], [Deleted], [LockUser], [LockSessionID], [LockDate], [InUse], coalesce([AddressTypeVId], (select [AddressTypeVId] from [dbo].[AddressTypes] where [AddressTypeID]=inserted.[AddressTypeID])), coalesce([CustomerVId], (select [CustomerVId] from [dbo].[Customers] where [CustomerID]=inserted.[CustomerID]))
from inserted
end

最佳答案

大多数重要细节都包含在 documentation 中:

@@IDENTITY and SCOPE_IDENTITY return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.

还有关于 @@IDENTITY 如何返回意外值的详细信息 - 但这些都与(正如预期的那样)范围 而不是其他 session 有关。

此集合中唯一与您是否正在处理其他 session 相关的函数是 IDENT_CURRENT

当然,如果您的代码还处理触发器(创建嵌套作用域),这些触发器还操作具有标识值的表(导致 @@IDENTITY 返回“错误的”值)并且您已经出于某种原因排除了 SCOPE_IDENTITY 那么您就不走运了。

关于c# - 如果我在多个同时查询中使用 IsolationLevel.Snapshot 进行事务查询,SELECT @@IDENTITY 将返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31802079/

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