SNAPSHOT «ЧИТАТЬ КОММЕНТИРОВАННЫЕ» SQL Server против SNAPSHOT

23

Я исследовал различия между SQL Server READ COMMITTED SNAPSHOTи SNAPSHOTуровнями изоляции и наткнулся на следующий ресурс:

Выбор уровней изоляции на основе версий строк

Для большинства приложений рекомендуется использовать фиксацию чтения с использованием контроля версий строк вместо изоляции моментальных снимков по следующим причинам:

  • Он потребляет меньше места в базе данных tempdb, чем изоляция моментальных снимков.

  • Изоляция моментальных снимков уязвима к конфликтам обновлений, которые не применимы к изолированной фиксации чтения с использованием управления версиями строк. Когда транзакция, выполняемая с изоляцией моментального снимка, считывает данные, которые затем изменяются другой транзакцией, обновление транзакцией моментального снимка до тех же данных вызывает конфликт обновления, и транзакция завершается и откатывается. Это не проблема с фиксацией на чтение, использующей управление версиями строк.

Я несколько новичок в этих темах, но я не могу понять два пункта из ссылки выше.

  1. Почему пространство tempdb будет другим для этих режимов? Один магазин хранит более гранулированные версии, чем другой?

  2. Почему изоляция моментальных снимков более уязвима для конфликтов обновлений?

Джон Рассел
источник

Ответы:

18
  1. READ COMMITTED SNAPSHOTиспользует новый снимок после каждого оператора. Это означает, что меньше версий строк поддерживаются. (Утверждение, которое вы цитировали из документации, немного вводит в заблуждение, поскольку предполагает, что это всегда так - это верно только в случае длительных SNAPSHOTтранзакций.) Версии строк снимков создаются при записи. Чтения не влияют на то, что помещается в базу данных tempdb. Писатели не могут предвидеть, что будет происходить в будущем. Читатели влияют только на то, что можно очистить.
  2. Когда SNAPSHOTтранзакция T1записывает в строку, которая была изменена другой транзакцией T2в промежутке между T1запуском и T1попыткой записи, инструкция завершается неудачно с ошибкой конфликта обновления. Это оптимистичная модель параллелизма. С READ COMMITTED SNAPSHOT T1будет ждать T2освобождения X-замка на строке и продолжить в обычном режиме.
USR
источник
1
Для # 2, можно ли с уверенностью сказать, что SNAPSHOT не блокирует только обновления - он просто полагается на управление версиями строк?
Джон Рассел
1
@JohnRussell блокируется исключительно для поддержки отката. Все записи должны X-lock, чтобы обеспечить возможность восстановления строки в случае отката.
USR
0

Еще одно различие между моментальным снимком и моментальным снимком для чтения заключается в следующем.

  1. снимок

В первой сессии

НАБЛЮДЕНИЕ НА УРОВНЕ ИЗОЛЯЦИИ SET TRAN НАЧАЛО TRAN SELECT * ОТ TB1 ..... .....

Во второй сессии

Обновить TB1 SET NAME = NAME + 'test', где id = 1

В первой сессии

SELECT * FROM TB1 - ЭТО возвратит имя значения для ID = 1, а не имя + 'test' COMMIT TRAN

В моментальном снимке с фиксацией чтения первый выбор в сеансе 1 вернет имя для id = 1, а второй выбор вернет имя + «тест».

Таким образом, в изоляции моментальных снимков SQL SERVER делает моментальный снимок в начале транзакции и считывает этот моментальный снимок в течение всей транзакции.

В моментальном снимке с фиксацией чтения снимок делается для каждого оператора SELECT во время транзакции.

Арташес Хачатрян
источник