Нарушение ПК на истории - PullRequest
       2

Нарушение ПК на истории

2 голосов
/ 26 сентября 2011

Это в 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

Но, время от времени, я получаю нарушение PK для dbo.AddressHistory с жалобойвставляется дубликат ПК.Как это возможно, если часть PK для AddressHistory является текущей отметкой времени вставки?

Даже при ее выполнении две строки успешно добавляются в таблицу истории:

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

И толькообновить sproc у меня для таблицы dbo.Address будет обновлять строку для данного AddressID.Таким образом, он должен обновлять только одну строку за раз.Моя вставка sproc также вставляет только одну строку за раз.

Есть идеи, из-за каких условий это происходит?

1 Ответ

7 голосов
/ 26 сентября 2011

На основании вашего описания два параллельных выполнения хранимой процедуры с одним и тем же параметром могут показаться вероятными.

datetime имеет точность только 1/300 секунды, поэтому конфликты могут возникать, если эти выполнения происходят очень близковместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...