2016-06-15 8 views
1

Ich habe eine Situation, in der ich eine Aktualisierung T-SQL in einer gespeicherten Prozedur (sp_update_queue) innerhalb einer Transaktion umbrechen muss. Aber ich frage mich, was passieren würde, wenn Sie zwei Threads verwenden, die dieselbe Verbindung verwenden, aber unterschiedliche Abfragen ausführen, und eine Transaktion zurücksetzt, die sie gestartet hat.T-SQL gespeicherte Transaktion Nebenläufigkeit

Zum Beispiel ThreadA sp_update_queue genannt Tabelle zu aktualisieren QUEUED_TASKS aber vor sp_update_queue verpflichtet/Rollback-Transaktion ThreadB führt ein anderes aktualisieren oder einfügen SQL auf einem anderen Tisch, sagt CUSTOMERS. Nachdem ThreadB beendet ist, tritt auf einen Fehler auf und ruft Rollback auf.

Da beide die gleiche Verbindung verwenden, würde Rollback auch die von ThreadB durchgeführten Änderungen rückgängig machen, unabhängig davon, ob ThreadB seine Änderungen innerhalb einer Transaktion vorgenommen hat oder nicht.

+1

Side Hinweis: Sie sollten ** nicht ** verwenden, um den 'sp_' Präfix für gespeicherte Prozeduren. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

+0

'wählen Sie @@ spid' aus jedem" Thread "aus. –

+0

Kannst du klarstellen, was du meinst, wenn du sagst "... sie benutzen beide dieselbe Verbindung ..."? –

Antwort

0

Jeder Thread, der die Ressource zuerst erhält, wird diese Ressource sperren (wenn Sie eine geeignete Isolationsstufe haben), sodass der zweite Thread auf die erforderliche Ressource wartet.

Hinweis: Jeder Thread hat seine eigene SessionId.

In Ihrem Szenario AKTUALISIERT jedoch beide Threads gleiche Verbindung verwenden, aber verwenden Sie keine gemeinsamen Ressourcen (ThreadA ist mit Tisch X zu tun und ThreadB mit Tisch Y zu tun hat). Das Commit oder Rollback jedes Threads (Thread A oder B) hat keinen Einfluss auf den anderen Thread.

Read more about Isolation Level

+0

sp_update_queue aktualisiert eine Tabelle in QUEUED_TASKS, lässt aber sagen, dass ThreadB eine andere Tabelle (Kunden) aktualisiert und daher nicht warten muss. Was würde in diesem Fall passieren? Ich habe meinen Beitrag aktualisiert, um das Szenario zu verdeutlichen –