У меня есть дорогостоящая хранимая процедура, которая запускается после изменения данных в таблице, чтобы предварительно вычислить некоторые скопления этих данных. (SP вызывается приложением, а не триггером в таблице, если это актуально, хотя это не является жестким требованием). Хранимая процедура почти полностью соответствует заявлению INSERT INTO ... SELECT
.Отказ от сохранения исполняемого процесса от другого сеанса/соединения
Данные обычно изменяются нечасто (то есть, вызовы SP нечасты), но они могут в принципе перекрываться. Чтобы обеспечить согласованность в этом случае, я использую sp_getapplock
, так что второй вызов будет ждать завершения первого процесса перед продолжением.
Это работает, но ожидание неэффективно и не нужно - первое, что делает моя хранимая процедура, - удалить все существующие (теперь устаревшие) данные. То, что я действительно хочу, - это второй вызов, чтобы рассказать о первом: «Не беспокойтесь о том, что вы делаете, теперь все изменилось - просто перестаньте работать, и я оставлю вещи в правильном состоянии».
Есть ли надежный способ для второго вызова, чтобы надежно прервать первый вызов SP в этом случае?
Возможно, вы попытаетесь получить идентификатор процесса первого процесса, используя sp_who, а затем убейте его? –