17

Простой вопрос?Почему READ_COMMITTED_SNAPSHOT не включен по умолчанию?

Почему READ_COMMITTED_SNAPSHOT не по умолчанию?

Я угадываю либо обратную совместимость, либо производительность, либо и то, и другое?

[Изменить] Обратите внимание, что меня интересует эффект, связанный с уровнем изоляции READ_COMMITTED, а не уровнем изоляции моментального снимка.

Почему это может быть изменением, поскольку он содержит меньше блокировок и до сих пор не считывает строки, не связанные с ним?

ответ

15

Оба. В основном совместимость.

Включение моментального снимка по умолчанию приведет к поломке подавляющего большинства приложений, ожидающих старого, блокирующего поведения. Снимок делает heavy Использование tempdb для хранилища версий и его влияние на производительность вполне измеримы.

+5

Использование многих многих замков не влияет на производительность? –

+2

Не могли бы вы объяснить, как это может нарушить приложение, которое «опирается на поведение блокировки»? Я провел много исследований и не могу понять, как кто-то может прийти к такому выводу. –

4

Он изменяет стратегию блокировки по умолчанию, исходя из того, как семейство Sybase/SQL Server работает навсегда. Это сломало бы все мои приложения, все приложение, которое я знаю в моем магазине, и повредило много важных данных.

Прочтите Wikipedia articleполностью: вы хотите, чтобы код, расположенный за вашим банковским приложением, использовал эту модель изоляции?

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

Это компромисс, как и большинство конструкций баз данных. В моем случае я могу иметь дело с блокировкой ожиданий/взаимоблокировок (редко) в качестве цены для более простой и более «из коробки» целостности данных. Мне еще предстоит решить проблему или проблему, когда я вижу изоляцию снимков как решение.

+2

Можете ли вы объяснить, как READ_COMMITTED_SNAPSHOT может привести к повреждению данных? –

18

Включение снимка по умолчанию сломается подавляющее большинство приложений

Неясно мне, если он сломается «подавляющее большинство» приложений. Или, если он сломает многие приложения способами, которые трудно идентифицировать и/или трудно работать. Документация SQL Server гласит, что READ COMMITTED и READ COMMITTED SNAPSHOT оба удовлетворяют определению ANSI READ COMMITTED. (Указано здесь: http://msdn.microsoft.com/en-us/library/ms189122.aspx) Итак, до тех пор, пока ваш код не полагается на что-либо, кроме буквального ANSI-требуемого поведения, в теории вы будете в порядке.

Усложнение состоит в том, что спецификация ANSI не отображает все, что люди обычно считают такими, как грязное чтение, нечеткое/не повторяемое чтение и т. Д. На практике. И есть аномалии (разрешенные определениями ANSI), которые могут встречаться под READ COMMITTED SNAPSHOT, которые не могут произойти под READ COMMITTED. Например, см. http://www.jimmcleod.net/blog/index.php/2009/08/27/the-potential-dangers-of-the-read-committed-snapshot-isolation-level/.

См. Также http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/d1b3d46e-2642-4bc7-a68a-0e4b8da1ca1b.

Для получения глубокой информации о различиях между уровнями изоляции, начиная с http://www.cs.umb.edu/cs734/CritiqueANSI_Iso.pdf (READ_COMMITTED_SNAPSHOT не было, когда эта статья была написана, но на других уровнях она покрыта).

+0

Собственно, (возможно, это изменилось), ответ таков: «По умолчанию моментальный снимок будет разбит подавляющее большинство приложений **, которые ожидают старое, блокирующее поведение ** _. Я понимаю, что существуют существующие приложения, полагающиеся на эту пессимистическую стратегию блокировки, которая, как ожидается, будет приостановлена ​​в ожидании блокировки. –