2017-06-26 4 views
0

Ich habe die folgende Linq:Deadlock QUERY in SqlServer

   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; 

wich wird folgende SQL umgewandelt werden:

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

das Problem ist jetzt, gibt es mehrere Updates parallel laufen, und ich habe Deadlock-Ausnahmen, aber ich verstehe nicht warum?

siehe auch enter image description hereenter image description here

+0

Welche Indizes haben Sie auf dem Tisch? Deadlocks werden oft mit Index-Tuning vermieden. –

+0

Öffnen Sie Transaktionen in Ihrem Code? Ich denke, das sollte nicht passieren, wenn Sie keine Transaktionen verwenden ... –

Antwort

0

Wenn Sie den ausgewählten Teil des Updates zu starten nicht ein anderer Prozess wollen in der Lage sein, verwenden Sie die UPDLOCK Hinweis oder setzen eine entsprechende Transaktionsisolationsstufe (REPEATABLE READ).

Weitere Informationen dazu, wie Nonclustered-Indizes Deadlocks verursachen können, finden Sie unter John Huang's Blog.

Beispiel unter Verwendung von Linq to SQL, die zu diesem Thema nicht Beute:

var opts = new TransactionOptions(); 
opts.IsolationLevel = IsolationLevel.RepeatableRead; 
using (var txn = new TransactionScope(TransactionScopeOption.Required, opts)) 
{ 
    // update command goes here. 

    txn.Complete(); 
}