web-dev-qa-db-ja.com

トランザクションなしで初期化された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();
    }
}
24
kateroh

BeginTransactionメソッドの場合:( MSDNリンク

また、テーブルレベルでSP)でヒントを使用したい場合は、 WITH(NOLOCK) -を使用しますが、自己責任で使用してください。

10
Bob Palmer

トランザクションを実行したくない場合は、接続を開いたときに一度設定すれば、変更するまでその設定のままになります。だからただする:

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

接続を開いて使用し、破棄するため、特定のケースにはおそらく最適ではありませんが、接続の寿命が長い人のためにこの回答を入れたいと思いました。

18
Eddie Deyo

ストアドプロシージャで、transact-sqlの場合:

SET TRANSACTION ISOLATION LEVEL read uncommitted    -- 0
SET TRANSACTION ISOLATION LEVEL read committed     -- 1
SET TRANSACTION ISOLATION LEVEL repeatable read    -- 2
SET TRANSACTION ISOLATION LEVEL read serializable  -- 3
7
ArBR

すでに既存の接続(および場合によっては既存のトランザクション)がある場合は、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();
}
6
piers7

ストアード・プロシージャーに別のパラメーターを追加して、ストアード・プロシージャーを実行する分離レベルを示します。

@isolevel = 0の場合SETTRANSACTION ISOLATIONLEVEL読み取りはコミットされていません。そうしないと

また、コミットされていない場合は、2つの「t」が必要だと思います。

0
Gordon Prince