Я исследовал различия между SQL Server READ COMMITTED SNAPSHOT
и SNAPSHOT
уровнями изоляции и наткнулся на следующий ресурс:
Выбор уровней изоляции на основе версий строк
Для большинства приложений рекомендуется использовать фиксацию чтения с использованием контроля версий строк вместо изоляции моментальных снимков по следующим причинам:
Он потребляет меньше места в базе данных tempdb, чем изоляция моментальных снимков.
Изоляция моментальных снимков уязвима к конфликтам обновлений, которые не применимы к изолированной фиксации чтения с использованием управления версиями строк. Когда транзакция, выполняемая с изоляцией моментального снимка, считывает данные, которые затем изменяются другой транзакцией, обновление транзакцией моментального снимка до тех же данных вызывает конфликт обновления, и транзакция завершается и откатывается. Это не проблема с фиксацией на чтение, использующей управление версиями строк.
Я несколько новичок в этих темах, но я не могу понять два пункта из ссылки выше.
Почему пространство tempdb будет другим для этих режимов? Один магазин хранит более гранулированные версии, чем другой?
Почему изоляция моментальных снимков более уязвима для конфликтов обновлений?
источник
Еще одно различие между моментальным снимком и моментальным снимком для чтения заключается в следующем.
В первой сессии
НАБЛЮДЕНИЕ НА УРОВНЕ ИЗОЛЯЦИИ 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 во время транзакции.
источник