什么是SELECT @@IDENTITY将返回,如果我有事务性查询与IsolationLevel.多个同时查询的快照

本文关键字:查询 IsolationLevel 快照 事务性 @@IDENTITY SELECT 返回 如果 什么 | 更新日期: 2023-09-27 18:06:17

我有一个表,有多个应用程序访问多个事务,我希望这些多个应用程序/事务得到每个主键/身份由执行该事务的应用程序相应地插入。由于某种原因,我不能使用SCOPE_IDENTITY,这就是为什么我最后的排序是使用@@IDENTITY。对于事务性查询,我实现了IsolationLevel。为每个事务创建快照,以避免阻塞。

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

交货。我有三个查询同时执行:

    Transactional1 Query Insert with expected return Identity 100;
  • Transactional2查询插入并返回Identity 102;
  • Transactional3 Query Insert with expected return;

它会像这样相应地返回Identity吗?this is my aim

  • Transaction1 - 100
  • Transaction2 - 102
  • Transaction3 - 103

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

  • Transaction1 - 102
  • Transaction2 - 103
  • Transaction3 - 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

什么是SELECT @@IDENTITY将返回,如果我有事务性查询与IsolationLevel.多个同时查询的快照

大多数重要的细节都包含在文档中:

@@IDENTITYSCOPE_IDENTITY返回当前会话中任何表生成的最后一个标识值。然而,SCOPE_IDENTITY只返回当前范围内的值;@@IDENTITY不受特定范围的限制。

还有关于@@IDENTITY如何返回意外值的详细信息-但这些都与作用域相关(正如预期的那样),而不是其他会话。

如果您正在处理其他会话,则此集合中唯一涉及的函数是IDENT_CURRENT

当然,如果你的代码还处理触发器(创建嵌套作用域),也操作表与标识值(导致@@IDENTITY返回"错误"的值),你已经排除了SCOPE_IDENTITY的某种原因,那么你就不走运了。