2017-02-14 6 views
1

ADO.NETを使用するC#アプリケーションとSNAPSHOTトランザクション分離レベルを持つSQLサーバーがあります。これは「そのまま」であり、残念ながら変更できません。スナップショット接続が破棄された後で、リンクサーバーの呼び出しが失敗する

リンクされたサーバーにstuffを挿入する必要があります。

は、我々は(問題を説明するために減少した)次のコードを実行します。

// Create a snapshot Transaction and close the connection 
using (var con = new SqlConnection(myConStr)) 
{ 
    con.BeginTransaction(TransactionLevel.Snapshot); 
} 

// do something with a linked server 
using (var con = new SqlConnection(myConStr)) 
{ 
    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "insert into LinkedServer.SomeDb..Table ..."; 
    cmd.ExecuteNonQuery(); 
    } 
} 

我々が得るの

「リモートアクセスは、トランザクションのためにサポートされていないリンクサーバーに何かを挿入しようと例外ができます分離レベル "SNAPSHOT" '

私は接続を開いて、それが破棄されていることを確認します(すべてのトランザクションをクリアします)。リンクされたサーバーコールに2番目の接続を使用します。

一般的なSQLを使用してSSMSで処理を実行しているようです。

私たちは何が欠けていますか?それを行う適切な方法はありますか?

正しい方向のヒントありがとうございます。

答えて

0

この問題を理解する秘密は、バックグラウンドでADO.NETによって行われる「接続プール」です。実際の接続は実際にはSNAPSHOTに設定されています。

サンプルコードの2番目の部分では、その接続は単純に再利用され、「スナップショットモード」になっています。

解決策は、Connectionを開いた直後に明示的にトランザクション分離レベルを別のものに設定することです。

using (var con = new SqlConnection(myConStr)) 
{ 
    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "set transaction isolation Level read committed"; 
    cmd.ExecuteNonQuery(); 
    } 

    using (var cmd = con.CreateCommand() 
    { 
    cmd.CommandText = "insert into LinkedServer.SomeDb..Table ..."; 
    cmd.ExecuteNonQuery(); 
    } 
} 
関連する問題