У меня есть таблица с именем Products
со многими столбцами. Это временная таблица, используемая для целей отчетности. Данные будут обрабатываться в этой таблице одновременно несколькими запросами пользователей. Существуют отдельные хранимые процедуры для выполнения операций DML с этой таблицей.
Структура таблицы:
CREATE TABLE Products (
instance uniqueidentifier,
inserted datetime,
col1,
col2,
...
)
Столбец inserted
будет заполнен GETDATE()
, содержащим время вставки каждой строки, а столбец instance
будет содержать значение из newid()
. Один пользовательский запрос будет иметь один уникальный идентификатор, но может содержать миллион строк. Ниже приведены запросы, которые будут выполняться одновременно, что приведет к взаимоблокировке. Пожалуйста, посоветуй мне
Запрос 1:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE instance = 'XXXX-xxx-xxx-xx'
Запрос 2:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DELETE P
FROM Products (NOLOCK)
WHERE inserted <= DATEADD(hh, -10, GETDATE())
Примечание. Некластеризованный индекс создается для столбца экземпляра.
Пожалуйста, посоветуйте мне, какой замок я могу использовать в этом сценарии.
Примечание. Я не смог получить первичный ключ, так как это требует времени, когда я вставляю 10 миллионов строк в таблицу (это для одной транзакции; есть 20 одновременных транзакций). Отчет должен быть сгенерирован раньше. И моя процедура имеет несколько 35 статусов DML, есть около 15 операторов DELETE для экземпляра столбца с другими столбцами (DELETE FROM table WHERE instance = @instance AND col1 = @col1
).