Как установить уровень изоляции на SqlCommand/SqlConnection, инициализированный без транзакции

Предполагается, что следующий метод переформатирует грязное чтение в открытом соединении. Нет транзакций. Где установить параметр 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();
    }
}

Ответы

Ответ 1

В методе BeginTransaction: (ссылка MSDN)

И если вы просто хотите использовать подсказки в своем SP на уровне таблицы, используйте WITH (NOLOCK) - но используйте на свой страх и риск.

Ответ 2

Если вы не хотите делать транзакции, вы можете установить его один раз, когда вы откроете соединение, и он останется на этом уровне, пока вы его не измените. Так просто:

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

Вероятно, это не самое лучшее для вашего конкретного случая, так как вы открываете соединение, используя его и отбрасывая, но я хотел бы включить этот ответ для всех, у кого есть более продолжительное соединение.

Ответ 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();
}

Ответ 4

В вашей хранимой процедуре для transact-sql используйте:

SET TRANSACTION ISOLATION LEVEL read uncommited    -- 0
SET TRANSACTION ISOLATION LEVEL read committed     -- 1
SET TRANSACTION ISOLATION LEVEL repeatable read    -- 2
SET TRANSACTION ISOLATION LEVEL read serializable  -- 3

Ответ 5

Добавьте еще один параметр в хранимую процедуру, чтобы указать уровень изоляции, с которым должна выполняться хранимая процедура.

IF @isolevel = 0  УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОБРАЖЕНИЯ СТАВКИ, прочитанный незафиксированным; ELSE

Также я считаю, что uncommitted нуждается в двух "t" в нем.