SQL事务自动回滚

时间:2018-08-30 08:16:57

标签: sql sql-server stored-procedures transactions locking

我正在使用Storedproc,并且DML语句在Transaction中发生。在交易中,我们正在更新多个列,如下所示:

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个事务)时,我们会收到此错误。

  

“事务(进程ID 102)已在另一个进程的锁定资源上死锁,并被选作死锁的受害者。重新运行事务。”

注意:每个事务都有不同的@pi_ImportTrnId,这意味着并行运行的事务将永远不会尝试更新同一行。

任何帮助/建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

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