2017-01-25 3 views
0

Ich habe einen tigger auf einer Tabelle, die mehrere Operationen ausführt. Es ist ein Business-Anforderungen, die diese Operationen (mindestens) ein vorgegebenes Zeitintervall voneinander geschehen, so plane ich folgendes zu verwenden:WAITFOR DELAY Leistungsüberlegungen

WAITFOR DELAY '00:00:05' 

Ich frage mich, was (wenn überhaupt) Leistungsüberlegungen sollte ich in Wenn die obige Anweisung verwendet wird, führt dies dazu, dass nachfolgende Einfügungen oder Aktualisierungen in der Tabelle blockiert werden, bis der Trigger abgeschlossen ist, oder wird der Trigger im Kontext des aktuellen Bereichs ausgeführt?

Antwort

1

wird es nachfolgende Einfügungen oder Aktualisierungen auf dem Tisch verursacht blockiert werden, bis der Auslöser

Ja abgeschlossen hat, ja, es wird. Der gesamte Inhalt eines Triggers wird im Kontext der Transaktion für das ursprüngliche Einfügen, Aktualisieren oder Löschen ausgeführt. (Es gibt immer eine Transaktion, entweder eine, die Sie explizit erstellen, oder eine, die SQL Server automatisch bereitstellt, und die möglicherweise automatisch festgeschrieben wird).

Deshalb ist der Ratschlag, niemals etwas Langsames (oder möglicherweise Langsames) in einen Trigger zu setzen - Sie behalten die ursprüngliche Transaktion und alle Sperren, die sie länger in Anspruch genommen hat.

Stattdessen würde ich vorschlagen, wenn Sie Ihre neue Aktivität von dem ursprünglichen Auslöser entkoppeln könnten - Sie könnten eine Service Broker-Nachricht senden oder eine Zeile zu einer Tabelle hinzufügen, die ein SQL Agent-Job liest, um nach neuen zu suchen arbeiten zu tun, oder etwas anderes - nur sicherstellen, dass es etwas lokal in der gleichen Datenbank und schnell ist.


üblicherweise wird diese Beratung im Zusammenhang mit dem Zugriff auf externe Ressourcen gegeben - das schnell sein kann zugreifen, wenn sie dort sind aber außerordentlich langsam sein, Fehler zu melden, wenn etwas kaputt ist.

+0

Vielen Dank für Ihre Antwort. Ich benutze tatsächlich eine Warteschlange Tabelle, die eine DateTime-Spalte hat, der Grund, warum ich die Wartezeit brauche, ist, weil eine Anwendung liest aus dieser Tabelle und verarbeitet Nachrichten auf einer FIFO-Basis. Ich könnte eine DateTime in dieses Feld 5 Sekunden von GETDATE() schreiben, das würde mein Problem lösen, denke ich. –

+0

@MickWalker - ja, das klingt besser. –