2010-12-03 8 views
15

次のメソッドは、開いている接続でダーティーな読み取りを実行することになっています。取引はありません。 IsolationLevelはどこで設定しますか? BeginTransactionメソッドでトランザクションなしで初期化されたSqlCommand/SqlConnectionで分離レベルを設定する方法

public string DoDirtyRead(string storedProcName, SqlConnection connection) 
{ 
    using (SqlCommand command = new SqlCommand(storedProcName, connection)) 
    { 
     command.CommandType = CommandType.StoredProcedure; 
     // HOW TO SET IsolationLevel to READ_UNCOMMITTED here? 
     command.ExecuteNonQuery(); 
    } 
} 

答えて

9

:(MSDN link

そして、あなただけのテーブルレベルで自分のSPでのヒントを使用したい場合は、WITH(NOLOCK)を使用する - が、ご自身の責任で使用します。あなたが取引を行うにはしたくない場合は、接続を開くとき

SET TRANSACTION ISOLATION LEVEL read uncommited -- 0 
SET TRANSACTION ISOLATION LEVEL read committed  -- 1 
SET TRANSACTION ISOLATION LEVEL repeatable read -- 2 
SET TRANSACTION ISOLATION LEVEL read serializable -- 3 
+0

(これをトランザクション内でラッピングして分離レベルを設定するか、SPでヒントを使用する必要があります)。 –

+0

トランザクションを全く使用したくない – kateroh

+0

次に、テーブルのヒントに戻ります(上記の編集を参照)。 –

5

あなたがそれを変更するまでその設定で。あなたは、接続を開くことを利用して、それを捨てていることから、おそらく

connection.BeginTransaction(IsolationLevel.ReadUncommitted).Commit(); 

なく、あなたの特定のケースのための最高のが、私は長い寿命を持つ人のためにこの答えを入れたかった。だからやります接続。

+0

また、表に対してDATAROWSロック・スキームを設定することを検討してください。 – ArBR

+0

あなたの答えに感謝します。これは、ストアドプロシージャを常に汚い読み取りにするため、役立たないでしょう。代わりに私はトランザクションで、または可能であればトランザクションなしで自分のコード内で制御したいので、ストアドプロシージャはいずれかの分離レベルで呼び出すことができます。 – kateroh

15

は、あなたが一度それを設定することができ、それが残ります:Transact-SQLの使用するため、手順保存されている

+0

'BeginTransaction'は' IDisposable'の 'DbTransaction'を返します。参照を破棄すればどこで 'Dispose'を呼び出しますか? –

+4

使い捨ての返品オブジェクトを避けたい場合は、接続を開いた後、 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 'の非問い合わせを実行するだけです。接続が閉じられるか、変更されるまで、接続はその状態になります。 – DarrenMB

+4

接続プールの監視...同じ接続文字列から次の「新規」接続を作成すると、設定したものと同じ分離レベルで古い接続を元に戻すことができます。 – foxontherock

6

すでに既存の接続(おそらく既存のトランザクション)がある場合、私はTransactionScopeを使用して子の分離レベルを制御します。

using (var command = connection.CreateCommand()) 
using(new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions{IsolationLevel = IsolationLevel.ReadUncommitted})) 
{ 
    command.CommandText = string.Format("select count(*) from {0}", tableName); 
    return (int)command.ExecuteScalar(); 
} 
0

が希望分離レベルで実行するストアドプロシージャを示すために、あなたのストアドプロシージャに別のパラメータを追加します。これは、ダーティリードの行数(私は信じている)を行います。

IF @isolevel = 0 SET TRANSACTION ISOLATION LEVEL読み取りコミットされていません。 ELSE

また、コミットされていない2つの「t」が必要です。

関連する問題