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

Простой вопрос?

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

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

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

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

Ответы

Ответ 1

И. В основном совместимость.

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

Ответ 2

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

Мне непонятно, нарушит ли это "подавляющее большинство" приложений. Или, если он сломает многие приложения способами, которые трудно идентифицировать и/или трудно работать. Документация 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 не было, когда эта статья была написана, но другие уровни покрываются им).

Ответ 3

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

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

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

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