2010-12-03 4 views
15

Предполагается, что следующий метод переформатирует грязное чтение в открытом соединении. Нет транзакций. Где я могу установить IsolationLevel?Как установить уровень изоляции на SqlCommand/SqlConnection, инициализированный без транзакции

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

ответ

9

О методе НачатьТранзакцию: (MSDN link)

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

+0

(Таким образом, вам нужно обернуть это в транзакции, чтобы установить уровень изоляции, или просто использовать подсказки в своем SP). – 2010-12-03 01:09:49

+0

Я вообще не хочу использовать транзакцию – kateroh 2010-12-03 01:13:57

+0

Затем вы возвращаетесь к табличным подсказкам (см. Править выше). – 2010-12-03 01:15:03

5

В вашей хранимой процедуры для 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 
15

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

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

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

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

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

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

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

Смежные вопросы