У нас есть набор элементов в таблице, а дети-работники вызывают StoredProc(get_next_item)
, чтобы получить следующий предмет для обработки.SQL Server: Тупики во время маркера, выдающие хранимую процедуру в многопроцессном сценарии
Хранимая процедура придает token
к элементу при каждом вызове и возвращает назад деталь в указанном ниже порядке
- Первые товары с пометкой «P1»
- И тогда остальные из них
Выборочные данные:
item priority token
--------------------------
item1 P1 NULL
item2 NULL NULL
item3 P1 NULL
item4 NULL NULL
item5 P1 NULL
item6 NULL NULL
item7 NULL NULL
хранимых процедур "Get_next_item":
Declare @token int,
@item varchar(50),
@prty varchar(50)
EXEC get_token 'token_key',@token out
BEGIN TRAN
BEGIN TRY
SET ROWCOUNT 1
-- FIRST TRY P1 ITEMS (U1)
UPDATE Item_audit
SET token = @token
WHERE priority = 'P1' AND token IS NULL
SELECT @rows = @@ROWCOUNT
-- IF no more P1 then rest of the items (U2)
IF 0 = @rows
BEGIN
UPDATE Item_audit
SET token = @token
WHERE token IS NULL
SELECT @rows = @@ROWCOUNT
END
IF @rows <> 0
BEGIN
SELECT @item = item , @prty = priority
FROM Item_audit
WHERE token = @token
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
SET @err_msg = 'Exception '
GOTO ERROR
END CATCH
IF @@TRANCOUNT > 0
COMMIT
Вопросы:
Тупики рассматриваются в отчетности обновлений (U1 & U2), когда несколько процессов UNIX вызвать StoredProc(get_next_item)
, почему?
Спасибо Али, интересно, что может быть причиной тупиков? – Shashi
У вас слишком много ненужных заявлений и выбор, уменьшение количества обновлений и выборок определенно поможет. –
** Обновление: ** Тупики, похоже, уходят, когда запросы были более конкретными, например 'U1: WHERE ISNULL (приоритет, '%^@ ^%') = 'P1' И токен IS NULL' и' U2: ГДЕ ISNULL (приоритет,%^@ ^%) <> 'P1' И токен IS NULL' – Shashi