次のメソッドは、開いている接続でダーティ読み取りを実行することになっています。取引はありません。分離レベルはどこで設定しますか?
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();
}
}
BeginTransactionメソッドの場合:( MSDNリンク )
また、テーブルレベルでSP)でヒントを使用したい場合は、 WITH(NOLOCK) -を使用しますが、自己責任で使用してください。
トランザクションを実行したくない場合は、接続を開いたときに一度設定すれば、変更するまでその設定のままになります。だからただする:
connection.BeginTransaction(IsolationLevel.ReadUncommitted).Commit();
接続を開いて使用し、破棄するため、特定のケースにはおそらく最適ではありませんが、接続の寿命が長い人のためにこの回答を入れたいと思いました。
ストアドプロシージャで、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
すでに既存の接続(および場合によっては既存のトランザクション)がある場合は、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();
}
ストアード・プロシージャーに別のパラメーターを追加して、ストアード・プロシージャーを実行する分離レベルを示します。
@isolevel = 0の場合SETTRANSACTION ISOLATIONLEVEL読み取りはコミットされていません。そうしないと
また、コミットされていない場合は、2つの「t」が必要だと思います。