Ответ 1
В методе BeginTransaction: (ссылка MSDN)
И если вы просто хотите использовать подсказки в своем SP на уровне таблицы, используйте WITH (NOLOCK) - но используйте на свой страх и риск.
Предполагается, что следующий метод переформатирует грязное чтение в открытом соединении. Нет транзакций. Где установить параметр 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();
}
}
В методе BeginTransaction: (ссылка MSDN)
И если вы просто хотите использовать подсказки в своем SP на уровне таблицы, используйте WITH (NOLOCK) - но используйте на свой страх и риск.
Если вы не хотите делать транзакции, вы можете установить его один раз, когда вы откроете соединение, и он останется на этом уровне, пока вы его не измените. Так просто:
connection.BeginTransaction(IsolationLevel.ReadUncommitted).Commit();
Вероятно, это не самое лучшее для вашего конкретного случая, так как вы открываете соединение, используя его и отбрасывая, но я хотел бы включить этот ответ для всех, у кого есть более продолжительное соединение.
Учитывая, что у вас уже есть существующее соединение (и, возможно, существующая транзакция), я бы использовал 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();
}
В вашей хранимой процедуре для 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
Добавьте еще один параметр в хранимую процедуру, чтобы указать уровень изоляции, с которым должна выполняться хранимая процедура.
IF @isolevel = 0 УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОБРАЖЕНИЯ СТАВКИ, прочитанный незафиксированным; ELSE
Также я считаю, что uncommitted нуждается в двух "t" в нем.