2016-06-15 9 views
1

トランザクション内でストアドプロシージャ(sp_update_queue)に更新T-SQLをラップする必要がある状況があります。しかし、同じ接続を使用していて、異なるクエリを実行しているスレッドと、開始したトランザクションをロールバックするスレッドが2つある場合、どうなるかと思います。T-SQLストアドプロシージャトランザクション同時実行性

は、例えば、スレッドAがテーブルQUEUED_TASKSを更新するsp_update_queueと呼ばれるが、sp_update_queueコミット/ロールバックする前に、トランザクションThreadBは、いくつかの他の更新を実行または別のテーブルの上にSQLを挿入し、CUSTOMERSを言います。その後、スレッドBが終了すると、sp_update_queueにエラーが発生し、ロールバックが呼び出されます。

ThreadBがトランザクション内で変更を加えたかどうかにかかわらず、両方とも同じ接続を使用しているため、ロールバックはThreadB?によって行われた変更をロールバックします。

+1

サイドノート:あなたは** **あなたのストアドプロシージャのための 'sp_'接頭辞を使用しないでください。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です。 –

+0

それぞれの「スレッド」から 'select @@ spid'を呼び出します。 –

+0

「どちらも同じ接続を使用しています...」と言ったときの意味を明確にすることはできますか? –

答えて

0

リソースを最初に取得する各スレッドは、(適切な分離レベルがある場合)そのリソースをロックするため、2番目のスレッドは必要なリソースを待機します。

注:各スレッドには独自のSessionIdがあります。

は、(スレッドAがテーブルXを扱っているとThreadBがテーブルYを扱っている)しかし、スレッドの両方が同じ接続を使用している、あなたのシナリオでは

を更新しましたが、任意の共通リソースを使用しないでください。したがって、各スレッド(スレッドAまたはスレッドB)のコミットまたはロールバックは、他のスレッドに影響を与えません。

Read more about Isolation Level

+0

sp_update_queueはQUEUED_TASKSを呼び出してテーブルを更新しますが、ThreadBが別のテーブル(Customers)を更新しているため、待つ必要はありません。この場合、どうなるでしょうか?シナリオを明確にするために投稿を更新しました –

関連する問題