У меня есть хранимая процедура, которая считывает идентификатор строки со статусом 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
из таблицы ... поэтому я предполагаю, что мне нужна какая-то блокировка или что-то еще, чтобы предотвратить это.
Есть ли способ гарантировать, что выполнение хранимой процедуры в одно и то же время приведет к выполнению одного, а затем другого (последовательно)?
Спасибо.
mysql
,postgresql
,sql-server
,oracle
илиdb2
, или что-то другое. - person marc_s   schedule 04.11.2015