Мы используем SQL Server 2017. У нас есть READ_COMMITTED_SNAPSHOT ON
. У нас есть запрос, который выполняет удаление, а затем вставку, подобную этой:
begin transaction
SELECT DISTINCT STAGING.MyTable.CategoryId
INTO #categories_to_delete
FROM STAGING.MyTable;
commit;
begin transaction;
SELECT DISTINCT STAGING.MyTable.ItemId
INTO #items_to_delete
FROM STAGING.MyTable;
commit;
begin transaction;
DELETE FROM PROD.MyTableProd
FROM PROD.MyTableProd
INNER JOIN #categories_to_delete
ON #categories_to_delete.CategoryId = PROD.MyTableProd.CategoryId;
commit;
begin transaction;
DELETE FROM PROD.MyTableProd
FROM PROD.MyTableProd
INNER JOIN #items_to_delete
ON #items_to_delete.ItemId= PROD.MyTableProd.ItemId;
commit;
begin transaction;
INSERT INTO PROD.MyTableProd
SELECT
CategoryId
, ItemId
, <other_columns>
FROM
STAGING.MyTable;
commit;
Первичный ключ на PROD.MyTableProd
и STAGING.MyTable
равен ItemId
. Таблица prod содержит около 12 миллионов строк, а промежуточная таблица усекается при вставке данных на предыдущем шаге.
При этом мы будем часто получать нарушения первичного ключа на insert
. Я подозреваю, что из-за READ_COMMITTED_SNAPSHOT ON
блокировки insert
и delete
не блокируют друг друга, поэтому insert
происходит, когда delete
еще не закончился? Тем не менее, я думал, что завершение всех транзакций предотвратит такие проблемы? Любые предложения по предотвращению этих первичных ключевых проблем без необходимости выключать READ_COMMITTED_SNAPSHOT
? Есть ли способ отключить это только для этого стола?