kat*_*roh 23 sql t-sql sql-server sqlcommand isolation-level
以下方法应该在打开的连接上进行脏读.没有交易.我在哪里设置IsolationLevel?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Edd*_*eyo 17
如果您不想进行交易,可以在打开连接时将其设置一次,并且在您更改之前它将保持该设置.所以这样做:
connection.BeginTransaction(IsolationLevel.ReadUncommitted).Commit();
Run Code Online (Sandbox Code Playgroud)
可能不是最适合您的具体情况,因为您打开连接,使用它并扔掉它,但我想把这个答案放在任何有更长寿命连接的人身上.
在您的存储过程中,对于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
Run Code Online (Sandbox Code Playgroud)
鉴于您已经拥有现有连接(可能还有现有事务),我将使用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();
}
Run Code Online (Sandbox Code Playgroud)