Внедрите SQL Изоляция моментального снимка сервера 2016 в C # / ADO. NET для запросов SELECT - PullRequest
1 голос
/ 23 марта 2020

Чтобы длинные операции чтения не блокировали короткие и частые операции записи в моем существующем смешанном веб-приложении 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#?

1 Ответ

0 голосов
/ 23 марта 2020

Нет, вам нужно установить уровень изоляции в BeginTransaction метиде:

Если база данных включена для изоляции моментального снимка, но не настроена для READ_COMMITTED_SNAPSHOT ON вы должны инициировать SqlTransaction, используя значение перечисления IsolationLevel.Snapshot при вызове метода BeginTransaction.

В противном случае используется режим Read Committed по умолчанию, и READ будет блокироваться транзакциями, изменяющими стол (возможно).

...