Хранимая процедура SQL ожидает и выполняется последовательно

У меня есть хранимая процедура, которая считывает идентификатор строки со статусом x, а затем сразу же устанавливает для этого идентификатора строки статус y.

Поскольку эта хранимая процедура вызывается несколькими клиентскими приложениями, каким-то образом возвращаются одни и те же значения, тогда как на самом деле два ее выполнения не должны находить ничего в статусе x.

Я не использую ничего, кроме переноса действий в начальную транзакцию/фиксацию.

Грубый пример:

Begin Transaction
IF (@Param = '2') -- all
    BEGIN
        @resultID = (SELECT ... WHERE STATUS_ID = X
    END
ELSE
    BEGIN
        @resultID = (SELECT ... WHERE STATUS_ID = X
    END
IF (@ResultID > 0)
    BEGIN
        UPDATE JOB_QUEUE SET STATUS_ID = Y WHERE ID = @ResultID 
    END
COMMIT
SELECT * from JOB_QUEUE WHERE ID = @ResultID 

Каким-то образом запрос вернул то же самое @resultID из таблицы ... поэтому я предполагаю, что мне нужна какая-то блокировка или что-то еще, чтобы предотвратить это.

Есть ли способ гарантировать, что выполнение хранимой процедуры в одно и то же время приведет к выполнению одного, а затем другого (последовательно)?

Спасибо.


person Mr Me    schedule 04.11.2015    source источник
comment
Отметьте используемый продукт dbms. (Не похоже на ANSI SQL...)   -  person jarlh    schedule 04.11.2015
comment
Для какой СУБД это? Добавьте тег, чтобы указать, используете ли вы mysql, postgresql, sql-server, oracle или db2, или что-то другое.   -  person marc_s    schedule 04.11.2015
comment
Привет, это для сервера sql   -  person Mr Me    schedule 05.11.2015


Ответы (1)


Простой ответ заключается в том, чтобы ускорить весь процесс — если это медленный запрос, выбор может быть запущен до завершения обновления.

Если вам нужно выбрать значения для какого-либо другого отчета, вы можете эффективно запустить обновление в качестве первого оператора и использовать ключевое слово OUTPUT для возврата идентификаторов обновленных записей, например:

UPDATE JOB_QUEUE
SET STATUS_ID = Y WHERE STATUS_ID = X
OUTPUT inserted.ID
person SeanR    schedule 04.11.2015
comment
мне нужно получить идентификатор на основе параметров (изменить предложение where), а затем обновить этот идентификатор записи и вернуть всю строку. - person Mr Me; 05.11.2015
comment
я думаю, что вы правы, кажется, что выбор выполняется до обновления ... поэтому я хочу удерживать все остальные обращения к хранимой процедуре до тех пор, пока не будет завершено одно единственное выполнение. - person Mr Me; 05.11.2015