死锁在SqlServer中执行Query

时间:2017-06-26 16:21:56

标签: c# sql-server linq deadlock

我是以下的Linq:

                var qry = s.GetTable<MessageEventDTO>().Where(x => x.MessageName == messageName && x.SourceTyp == sourceTyp && x.Source == source && (x.Status == MessageEventStatus.open || x.Status == MessageEventStatus.acknowledged));

                goneMessages = qry.ToList();

                var ret = qry
                    .Set(x => x.Status, x => x.Status | MessageEventStatus.gone)
                    .Set(x => x.TimestampGone, timeStamp)
                    .Update();
                return ret;

将转换为以下SQL:

      UPDATE MessageEvents SET Status = Status | 1, TimeStampGone = @1 WHERE MessageName = @2 AND SourceTyp = @3 Source = @4 AND (Status = 0 OR Status = 2)

问题是现在,有多个并行运行的更新,我遇到了死锁异常,但我不明白为什么?

另请参阅enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

如果您不希望其他进程能够启动更新的选择部分,请使用 UPDLOCK 提示或设置适当的事务隔离级别( REPEATABLE READ )。

&#xA;&#xA;

参见 John Huang的博客,以更全面地解释非聚簇索引如何导致死锁。

&#xA;&#xA;

使用Linq to SQL的示例不是这个问题的牺牲品:< / p>&#xA;&#xA;

  var opts = new TransactionOptions();&#xA; opts.IsolationLevel = IsolationLevel.RepeatableRead;&#xA; using(var txn = new TransactionScope(TransactionScopeOption) 。需要,选择))&#xA; {&#xA; //更新命令到这里。&#xA;&#xA; txn.Complete();&#XA;}&#XA;  
&#XA;