Как установить уровень изоляции для SqlCommand / SqlConnection, инициализированного без транзакции - PullRequest
22 голосов
/ 03 декабря 2010

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

Ответы [ 5 ]

17 голосов
/ 25 августа 2011

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

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

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

10 голосов
/ 03 декабря 2010

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

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

7 голосов
/ 03 декабря 2010

В вашей хранимой процедуре , для 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
6 голосов
/ 15 июня 2013

Учитывая, что у вас уже есть существующее соединение (и, возможно, существующая транзакция), я бы использовал TransactionScope для контроля уровня изоляции дочернего элемента.Это делает грязное чтение rowcount (я считаю):

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();
}
0 голосов
/ 29 сентября 2017

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

IF @isolevel = 0 SET УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ чтение незафиксировано;ELSE

Также я считаю, что незафиксированным нужно две буквы "t".

...