Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL事务自动回滚_Sql_Sql Server_Stored Procedures_Transactions_Locking - Fatal编程技术网

SQL事务自动回滚

SQL事务自动回滚,sql,sql-server,stored-procedures,transactions,locking,Sql,Sql Server,Stored Procedures,Transactions,Locking,我使用的是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

我使用的是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个事务),我们得到了这个错误

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

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


如有任何帮助/建议,将不胜感激。谢谢

没有索引
——这就是问题所在。在
ImportTrnId
列上放置索引, 以单语句的方式重写查询,删除
readuncommitter
,它就会正常运行

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

“将事务隔离级别设置为读取未提交”-不要这样做@即使移除隔离级别,MitchWheat也会遇到同样的问题。此查询可以轻松地重写为单个语句。您对隔离级别做出了一个奇怪的选择,我猜,
ImportTrnId
上没有索引。顺便问一下,是否有任何触发器?正如其他人所说,这里更倾向于使用单个
更新。并为它提供一组要使用的
ImportTrnId
s,而不是使用不同的
@pi\u ImportTrnId
值多次运行同一查询