У меня есть пара сто линии хранимую процедуру, которая принимает один параметр (@id
) и сильно упрощена, чтобы что-то вроде:Как я могу сериализовать несколько исполнений хранимой процедуры с теми же аргументами?
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT INTO #new_result
EXEC pr_do_a_ton_of_calculations
DELETE FROM result WHERE id = @id
INSERT INTO result
SELECT * FROM #new_result
Несколько процессов могут вызвать эту процедуру одновременно с теми же параметрами. Я испытываю, что оба исполнения удаляют строки один за другим, а затем пытаются вставить одни и те же данные один за другим. В результате возникает одна ошибка, поскольку она вставляет повторяющиеся данные и нарушает уникальное ограничение.
В идеале я хотел бы убедиться, что два соединения, выполняющие процедуру с одним и тем же параметром @id
, будут выполнять как DELETE
, так и INSERT
серийно, без блокировки всей таблицы. Это также прекрасно, если две процедуры полностью сериализованы, если они не мешают выполнению других вызовов с другим параметром.
Есть ли способ, которым я могу это достичь?
Является ли процедура вставки того же идентификатора, который она удалила? – Quassnoi
Quassnoi: proc только вставляет строки с тем же «id», который был удален, но чтобы быть ясным, существует много строк с одним и тем же «id». 'Id' на самом деле является внешним ключом. –
Любая конкретная причина, по которой вы используете 'READ UNCOMMITTED'? Была ли попытка справиться с этой проблемой? – Quassnoi