Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Transaktionsumfang-Timeouts verstehen

Versuchen Sie es mal so zu sehen:

Die Länge der Transaktion wird nur bestimmt, wenn Sie trans.Complete() aufrufen oder den Transaktionsbereich verlassen. Nehmen Sie den folgenden Code:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

Es gibt keine Möglichkeit, innerhalb der Schlafroutine eine Timeout-Ausnahme auszulösen, und es wäre auch nicht sinnvoll, wenn dies der Fall wäre. Daher kann die Verwendung von Transaktions-Timeouts (zumindest auf diese Weise) nur garantieren, dass die Transaktion nicht ausgeführt wird, wenn sie länger als Ihr Timeout dauert.

Wenn Sie nur eine Abfrage ausführen (wobei ich nicht weiß, wofür Sie die Transaktionen verwenden), können Sie das Abfrage- / Befehls-Timeout (oder wie auch immer Sie es nennen) festlegen. IIRC, Ihre Abfrage wird sofort nach Ablauf des Timeouts zurückgegeben.

Eine andere Möglichkeit wäre, das Zeitlimit für Ihre Webdienstanfrage festzulegen und einfach anzunehmen, dass der Webdienst zu lange braucht, um zu antworten, weil irgendetwas in Ihrer Transaktion enthalten war.

EDIT:Sie könnten versuchen:

  • Erzeugen Sie Ihre Transaktion in einem anderen Thread und warten Sie dann, bis sie abgeschlossen ist (unter Verwendung von Thread.Join(timeout)) in Ihrem Hauptthread (einer, der vom Webservice-Aufruf verwendet wird). Wenn es also nicht vor dem von Ihnen angegebenen Timeout beendet wird, können Sie aufhören zu warten und einen Timeout-Fehler zurückgeben (vergessen Sie nicht, dem anderen Thread zu signalisieren, die Transaktion abzubrechen).
  • Angenommen, Sie führen nur SQL-Abfragen innerhalb dieser Transaktionen durch, könnten Sie das Schlüsselwort "BEGIN TRANSACTION" verwenden, um die Transaktion im SQL-Skript anzugeben (in der Tat hacky). Dann könnten Sie einfach das Befehls-Timeout angeben und all dies in einer einzigen Codezeile ausführen. Aber dann müssen Sie alles, was Sie innerhalb der Transaktion tun, in ein SQL-Skript verschieben, was für Sie möglich sein kann oder nicht ... und es ist nicht sauber.