Уровень изоляции и DIRT READ SQL SERVER 2005 (расширенный вопрос) - PullRequest
0 голосов
/ 19 апреля 2010

Я опишу мою проблему для более простого объяснения:

У меня есть таблица, и моя программа обращается к ней (обновляет, вставляет) с помощью транзакции.

Проблема в том, что я хочу включить DIRT READ в этой таблице. Но я не могу использовать с (nolock) в моих операторах sql, потому что я не могу изменить программный источник. Поэтому я подумал о том, чтобы включить грязное чтение в процессе sql, который начинает транзакцию.

Он видит, что команды "SET ISOLATION LEVEL ..." и "WITH (NOLOCK)" выполняются в инструкциях, которые обращаются к заблокированной таблице ... вот чего я стараюсь избегать. Я хочу включить чтение грязи в операторе, с которого начинается транзакция ...

спасибо заранее!

1 Ответ

1 голос
/ 19 апреля 2010
  1. Нет смысла изменять уровень изоляции ваших записей , таких как вставка или обновление. Пишет всегда берет эксклюзивные блокировки на все, что они обновляют, точка. Что вы можете сделать, это изменить уровень изоляции ваших операций чтения , ваших операторов SELECT.
  2. Грязные чтения никогда не нужны. В 99% случаев они указывают на неверную схему и структуру запроса, что приводит к сквозному сканированию, которое гарантированно блокируется на заблокированных строках. Решение состоит в том, чтобы правильно изменить схему, добавить необходимые индексы, чтобы избежать сканирования. Это не требует изменения источника.
  3. В тех редких случаях, когда конфликт действительно неизбежен и схема спроектирована правильно, ответом является не включение грязного чтения, а обращение к изоляция снимка :

    ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON;
    ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;

В тех немногих развертываниях, где накладные расходы на управление версиями строк, вызванные изоляцией моментальных снимков, видны, у них есть профессионалы, которые могут решить эту проблему.

...