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.
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! –
'wählen Sie @@ spid' aus jedem" Thread "aus. –
Kannst du klarstellen, was du meinst, wenn du sagst "... sie benutzen beide dieselbe Verbindung ..."? –