如何在没有事务的情况下初始化的SqlCommand/SqlConnection上设置隔离级别

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)

可能不是最适合您的具体情况,因为您打开连接,使用它并扔掉它,但我想把这个答案放在任何有更长寿命连接的人身上.

  • 注意连接池...当您从相同的连接字符串创建下一个"新"连接时,它会返回您的旧连接,具有您可能设置的相同隔离级别. (6认同)
  • 如果你想避免一次性返回对象,另一种选择是在你打开你的连接之后执行一个非查询"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;`.然后连接将处于该状态,直到它被关闭或改变为止. (5认同)

Bob*_*mer 10

在BeginTransaction方法:( MSDN链接)

如果您只想在桌面级别使用SP中的提示,请使用WITH(NOLOCK) - 但使用风险自负.


ArB*_*rBR 7

在您的存储过程中,对于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)


pie*_*rs7 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();
}
Run Code Online (Sandbox Code Playgroud)