2016-07-21 16 views
0

Ich untersuche einen Prozess, den ich nicht erstellt habe. Es verwendet den Service Broker, um eine Warteschlange von Kontakten zu erstellen, die dann eine Aktion gegen sie benötigen.SQL Server Service Broker Deadlock

Es gibt dann einen Handler, der 10k Datensätze empfängt und sie an eine gespeicherte Prozedur zur Verarbeitung übergibt.

Was passiert, wenn dieser letzte Prozess für einen Deadlock ohne Fehlerbehandlung fehlschlägt? Gehen diese zurück in die Warteschlange? Wenn nicht, was müsste ich tun, um sie wieder in die Warteschlange zu bekommen?

+0

Haben Sie versucht, den Prozess zu blockieren und zu sehen, was passiert? – dfundako

+0

Nein. Leider bin ich momentan auf einem Live-Server. Ich hatte gehofft, dass jemand wissen würde, ob es ein Standardverhalten dafür gibt. Ich hatte bei der Suche widersprüchliche Berichte gesehen und möchte vermeiden, einen neuen Prozess zum Testen des Standardverhaltens zu erstellen. Das ist, wenn ** ein Standardverhalten ist. –

+0

Wenn alles in der Transaktion ist, wird es zurückgesetzt. Wenn nicht, dann haben Sie: 'peek' - done,' process' - fail. Als separate Transaktionen. –

Antwort

1

Auf Service Broker-Warteschlangen kann von einer Transaktion aus zugegriffen werden. Also, wenn Sie so etwas wie dies in Ihrem Code zu tun (die unten ist Pseudo-Code, die tatsächlich robuster Service-Broker-Code ist ein wenig über den Rahmen Ihrer Frage):

begin tran 
    receive top(10000) message_body 
    into @table 
    from dbo.yourQueue; 

    while(1=1) 
    begin 
     select top(1) @message = message 
     from @table; 
     if (@message is null) 
     break; 
     exec dbo.processMessage @message; 
    end 
commit tran 

... dann sind Sie eingestellt. Was ich sage ist, dass, solange Sie Ihre receive und Verarbeitung in der gleichen Transaktion, jeder Fehler (Deadlocks eingeschlossen) Rollback der Transaktion und setzen Sie die Nachrichten zurück in die Warteschlange. Stellen Sie jedoch sicher, dass Sie die Handhabung von Giftnachrichten lesen! Wenn Sie zu viele Rollbacks erhalten, geht SQL davon aus, dass eine nicht verarbeitbare Nachricht vorliegt, und beendet die Warteschlange. Das ist ein schlechter Tag, wenn das passiert.