Транзакция SQL откатывается автоматически - PullRequest
0 голосов
/ 30 августа 2018

Я использую Storedproc, и в транзакции выполняются операторы DML. В транзакции мы обновляем несколько столбцов, как показано ниже:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

BEGIN TRAN

UPDATE TBLMarket SET [YR] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [YR] = ' ';
UPDATE TBLMarket SET [TYBEG] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [TYBEG] = ' ';
UPDATE TBLMarket SET [TYEND] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [TYEND] = ' ';
UPDATE TBLMarket SET [PSEQ] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [PSEQ] = ' ';
UPDATE TBLMarket SET [CTI] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [CTI] = ' ';
UPDATE TBLMarket SET [GTI] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [GTI] = ' ';
UPDATE TBLMarket SET [PTI] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [PTI] = ' ';
UPDATE TBLMarket SET [TIPR] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [TIPR] = ' ';
UPDATE TBLMarket SET [RAR] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [RAR] = ' ';
UPDATE TBLMarket SET [TMOD_E] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [TMOD_E] = ' ';
UPDATE TBLMarket SET [ATI] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [ATI] = ' ';
UPDATE TBLMarket SET [PERC] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [PERC] = ' ';
UPDATE TBLMarket SET [PPCT] = NULL WHERE ImportTrnId = @pi_ImportTrnId AND [PPCT] = ' ';
.
.
.
.
.
-----120 update statements
.
.

COMMIT TRAN

Но когда я запускаю несколько транзакций параллельно (мы пробовали 50 транзакций), мы получаем эту ошибку.

"Транзакция (идентификатор процесса 102) заблокирована для ресурсов блокировки другого процесса и выбрана в качестве жертвы тупика. Повторите транзакцию."

Примечание. У каждой транзакции будет свой @pi_ImportTrnId, что означает, что параллельная транзакция никогда не будет пытаться обновить один и тот же набор строк.

Любая помощь / предложение будет оценено. Спасибо!

1 Ответ

0 голосов
/ 30 августа 2018

There are no indexes - вот в чем проблема. Поместите индекс в столбец ImportTrnId, переписать ваш запрос одним оператором, удалите READ UNCOMMITTER, и он будет работать нормально.

UPDATE t SET
  [YR] = ISNULL(NULLIF(LTRIM(t.[YR]), ''), t.[YR]),
  [TYBEG] = ISNULL(NULLIF(LTRIM(t.[TYBEG]), ''), t.[TYBEG]),
  ...
FROM TBLMarket t
WHERE ImportTrnId = @pi_ImportTrnId
...