Чтобы длинные операции чтения не блокировали короткие и частые операции записи в моем существующем смешанном веб-приложении OLTP / отчетности, поддерживаемом SQL Server 2016, я хочу использовать изоляцию моментальных снимков для нескольких длительных запросов. Запросы уже хорошо проиндексированы и занимают много времени из-за больших объемов данных, и, хотя я могу использовать RCSI позже, я хотел бы начать с использования менее инвазивной изоляции моментальных снимков.
My Вопрос в том, как включить изоляцию моментальных снимков в моих запросах SELECT в C#? Кажется, мне пришлось бы обернуть мои запросы на выборку в транзакции, которая кажется совершенно неправильной.
List<Cat> cats = new List<Cat>();
TransactionOptions transactionOption = new TransactionOptions
{
IsolationLevel = IsolationLevel.Snapshot
};
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
{
using (SqlConnection sqlConnection = new SqlConnection(databaseConnectionString))
{
using (SqlCommand sqlCommand = sqlConnection.CreateCommand())
{
sqlCommand.CommandText = "proc_Select_A_Billion_Cats";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlConnection.Open();
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
{
while (sqlDataReader.Read())
{
// SOME CODE HERE can read the Cat object in from data reader
// Add this cat to the collection
cats.Add(cat);
}
}
}
}
}
С http://www.levibotelho.com/development/plugging-isolation-leaks-in-sql-server/ Я вижу, что в SQL Server 2014 и позже уровень изоляции будет сброшен при возвращении соединения в пул, так что это хорошо.
Но может ли быть правильным обернуть сохраненный pro c, который выполняет только SELECT в ADO. NET сделка? Нет ли лучшего способа, чем этот, для реализации изоляции моментальных снимков в C#?