Почему 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 работает навсегда. Это сломало бы все мои приложения, все приложения, которые я знаю в моем магазине, и повредил много важных данных.
Прочитайте статью Википедии полностью: хотите ли вы, чтобы код, стоящий за вашим банковским приложением, использовал эту изолирующую модель?
В общем, поэтому снимок изоляция ставит некоторые проблемы поддержание нетривиальных ограничений на пользователя, который может не оценить либо потенциальные ловушки, либо возможные решения. Достоверность этого передача - лучшая производительность.
Это компромисс, как и большинство проектов баз данных. В моем случае я могу иметь дело с блокировкой ожиданий/взаимоблокировок (редко) в качестве цены для более простой и более "из коробки" целостности данных. Я еще не сталкивался с проблемой или проблемой, где я вижу изоляцию снимков как решение.