历史表上的PK违规

Ted*_*erz 2 sql database sql-server sql-server-2005

这是在SQL Server 2005中.

我有一个地址表:

dbo.Address
(
  AddressID INT IDENTITY(1, 1) PRIMARY KEY
  LastUpdateBy VARCHAR(30)
  <bunch of address columns>
)
Run Code Online (Sandbox Code Playgroud)

我还有一个历史表:

dbo.AddressHistory
(
  AddressID INT,
  AsOf DATETIME,
  UpdateBy VARCHAR(30)
  <all the address columns>
  CONSTRAINT PK_dbo_AddressHistory PRIMARY KEY CLUSTERED (AddressID, AsOf)
)
Run Code Online (Sandbox Code Playgroud)

我在dbo.Address上有一个触发器,用于在INSERT和UPDATE上创建历史条目,它基本上会这样做:

INSERT INTO dbo.AddressHistory(AddressID, AsOf, UpdateBy, <address columns>)
SELECT AddressID, CURRENT_TIMESTAMP, @UpdateBy, <address columns>
FROM INSERTED
Run Code Online (Sandbox Code Playgroud)

但是,每隔一段时间,我就会在dbo.AddressHistory上获得PK违规,抱怨插入了重复的PK.如果AddressHistory的PK部分是插入的当前时间戳,这怎么可能?

即使执行此操作,也会成功在历史表中插入两行:

INSERT INTO dbo.Address
(LastUpdateBy, <address columns>)
SELECT 'test', <address columns>
FROM dbo.Address
WHERE AddressID < 3
Run Code Online (Sandbox Code Playgroud)

我为dbo.Address表唯一更新的sproc将为给定的AddressID更新一行.所以它应该一次只更新一行.我的插入sproc一次只插入一行.

知道什么条件会导致这种情况发生吗?

Mar*_*ith 7

根据您的描述,似乎有两个并行执行具有相同参数的存储过程.

datetime只有精度为1/300秒,因此如果这些执行非常接近,就会发生冲突.