我是以下的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)
问题是现在,有多个并行运行的更新,我遇到了死锁异常,但我不明白为什么?
答案 0 :(得分:0)
如果您不希望其他进程能够启动更新的选择部分,请使用 UPDLOCK
提示或设置适当的事务隔离级别( REPEATABLE READ
)。
参见 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;