Как выполнить запрос выбора при выполнении пакетной вставки - PullRequest
0 голосов
/ 31 октября 2011

У меня есть вопрос о том, как обрабатывать SQL-запросы к таблице при выполнении пакетных вставок в ту же таблицу.

У меня есть веб-приложение ASP.NET, которое создает множество объектов (возможно, 50000), которые вставляются пакетным способом в таблицу с использованием nHibernate. Даже при использовании оптимизаций Nhibernate это занимает до двух минут. Я выполняю это в транзакции базы данных с уровнем изоляции, установленным для чтения совершенного.

Во время пакетной вставки клиенты в веб-приложении должны иметь возможность читать ранее созданные данные в этой таблице. Однако они не должны иметь возможность читать незафиксированные данные. Моя проблема заключается в том, что если я использую уровень изоляции «чтение зафиксировано» в запросах на выборку, они истекают из-за ожидания завершения задания пакетной вставки.

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

Я проверил настройку уровня изоляции на «снимок», и это, похоже, решило мою проблему, но лучше ли это?

С уважением, Причудливый

1 Ответ

1 голос
/ 31 октября 2011

Изоляция SNAPSHOT возвращает данные, которые существовали до начала транзакции, и не блокирует таблицу, поэтому она не блокируется. Он также игнорирует другие транзакции блокировки, поэтому в вашем сценарии он звучит как наиболее подходящий для вас. Это означает, что поскольку ваши данные вставляются в пакет, никакие данные из этого пакета не будут доступны оператору SELECT до тех пор, пока пакет не завершится (т.е.)

  • Время 1: набор данных A существует в таблице
  • Время 2: Пакет начинает вставлять набор данных B в таблицу (но не фиксирует).
  • Время 3: приложение делает снимок и читает в наборе данных A.
  • Время 4: приложение завершает набор данных A (и только набор данных A).
  • Время 5: Пакетное завершение записи набора данных B; Набор данных A и набор данных B оба доступны в таблице.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...