ПРОЧИТАЙТЕ БЕЗ КОММИТАТЫ - PullRequest
0 голосов
/ 18 июня 2011

Время от времени я хочу запускать хранимую процедуру , чтобы получить приблизительную оценку количества записей в двух или трех разных таблицах, удовлетворяющих некоторым критериям.Если во время этой оценки новые записи добавляются, удаляются или обновляются, проблема на самом деле не возникает (я просто хочу приблизительную оценку).Таким образом, я могу позволить себе этот процесс, используя SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.Однако у меня есть два вопроса по этому поводу:

1) Поскольку я использую только инструкции SELECT COUNT(*), действительно ли мне нужно обернуть эти операторы в блок BEGIN/COMMIT TRANSACTION?

2)Нужно ли SET TRANSACTION ISOLATION LEVEL READ COMMITTED возвращаться в конец хранимой процедуры , или она будет установлена ​​автоматически после завершения ее выполнения?

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

1) Нет. Используется неявная транзакция для каждого оператора, если вы не укажете область транзакции.Вам не нужно устанавливать явную область действия транзакции для того, чтобы «установить уровень изоляции транзакции для работы».

2) Вам не нужно сбрасывать ее до первоначальной.Об этом позаботится SQL Server.Пожалуйста, обратитесь к этой записи SO: Области уровня изоляции транзакции

0 голосов
/ 18 июня 2011
  1. Нет.Чтения не должны быть в транзакции

  2. SET ограничен только для хранимой процедуры.Смотрите мой ответ здесь: Это нормально, если из одной хранимой процедуры я вызываю другую, которая устанавливает более низкий уровень изоляции транзакции? .Однако вы должны использовать подсказку NOLOCK, а не SET: SELECT COUNT(*) FROM myTable WITH (NOLOCK).

Если вы хотите приблизительное число без фильтров WHERE, используйте sys.dm_db_partition_stats.Смотрите мой ответ здесь: Самый быстрый способ подсчета точного количества строк в очень большой таблице?

...