26

以下方法应该在打开的连接上执行脏读。没有交易。我在哪里设置隔离级别?

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();
    }
}
4

5 回答 5

23

如果您不想进行交易,您可以在打开连接时设置一次,它将保持该设置,直到您更改它。所以就这样做:

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

对于您的具体情况可能不是最好的,因为您正在打开连接,使用它,然后将其丢弃,但我想将此答案提供给任何具有较长连接寿命的人。

于 2011-08-25T13:47:20.577 回答
12

关于 BeginTransaction 方法:(MSDN 链接

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

于 2010-12-03T01:08:11.823 回答
7

鉴于您已经有一个现有的连接(可能还有一个现有的事务),我将使用 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();
}
于 2013-06-15T00:33:18.157 回答
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
于 2010-12-03T01:21:46.097 回答
0

向您的存储过程添加另一个参数以指示您希望存储过程运行的隔离级别。

IF @isolevel = 0 SET TRANSACTION ISOLATION LEVEL 读取未提交;别的

我也相信 uncommitted 需要两个“t”。

于 2017-09-29T16:21:44.343 回答