这是在SQL Server 2005中。
我有一个地址表:
dbo.Address
(
AddressID INT IDENTITY(1, 1) PRIMARY KEY
LastUpdateBy VARCHAR(30)
<bunch of address columns>
)
我还有一张历史表:
dbo.AddressHistory
(
AddressID INT,
AsOf DATETIME,
UpdateBy VARCHAR(30)
<all the address columns>
CONSTRAINT PK_dbo_AddressHistory PRIMARY KEY CLUSTERED (AddressID, AsOf)
)
我在dbo.Address上有一个触发器,用于在INSERT和UPDATE上创建历史条目,基本上这样做:
INSERT INTO dbo.AddressHistory(AddressID, AsOf, UpdateBy, <address columns>)
SELECT AddressID, CURRENT_TIMESTAMP, @UpdateBy, <address columns>
FROM INSERTED
但是,每隔一段时间,我就会在dbo.AddressHistory上发生PK违规,抱怨插入了重复的PK。如果AddressHistory的PK部分是插入的当前时间戳,那怎么可能呢?
即使执行此操作,也会成功在历史记录表中插入两行:
INSERT INTO dbo.Address
(LastUpdateBy, <address columns>)
SELECT 'test', <address columns>
FROM dbo.Address
WHERE AddressID < 3
我对dbo.Address表的唯一更新sproc将为给定的AddressID更新一行。所以它应该一次只更新一行。我的插入sproc一次只能插入一行。
知道导致这种情况发生的原因是什么?
答案 0 :(得分:7)
根据您的描述,似乎可能会使用相同的参数同时执行两个存储过程的执行。
datetime
只有1/300
秒的精度,因此如果这些执行非常接近,就会发生冲突。