SQLスクリプトが与えられた場合:
- トランザクションを開始します。サーバーXから開始されます
- テーブルAからテーブルB(=新しいテーブル)へのクエリからselectintoを実行します
- テーブルAをテーブルC(=新しいテーブル)に選択します
- 専念。
エラーは発生しません。すべてが1台のサーバーで行われるため、これはまだ分散トランザクションではありません。
ここで、3。になるとしましょう。
- テーブルAをテーブルCに選択しますが、テーブルCは別のサーバー上にあります(
EXECUTE('SELECT * INTO ...') AT [remoteserver]
FROM句では3つのプレフィックス構文が許可されていますが、INTO句では許可されていないため、これを行う必要があります)
これで、SQL Serverは、このステートメント(3)が(現在分散されている)トランザクションで別のステートメントとの競合を生成することを通知します。
エラーの原因を示し、分散トランザクションが実際に私のセットアップで機能することを証明するために、ステップ2)をコメントアウトします。
これですべてが機能します。したがって、ステップ2)で問題が発生します。ただし、ステップ2)は基本的に、テーブルAと他のいくつかのテーブルで結合選択を実行してテーブルBを生成するだけで、他には何も実行しません。
その場合(分散トランザクションバージョンの場合)、ステップ3)を問題なく実行できないのに、同じ非分散トランザクションバージョンが問題なく機能するのはなぜですか?そして、どのような対立が起こり得るのでしょうか?