Чтение зафиксированного снимка и уровень изоляции снимка

может ли кто-нибудь помочь мне понять, когда использовать уровень изоляции моментального снимка над прочитанным зафиксированным моментальным снимком в SQL Server?

Я понимаю, что в большинстве случаев READ COMMITTED SNAPSHOT работает, но не уверен, когда перейти к изоляции моментальных снимков.

спасибо

4 ответов


READ COMMITTED SNAPSHOT делает оптимистические чтения и пессимистические записи. В отличие от этого, SNAPSHOT делает оптимистические чтения и оптимистические записи.

Microsoft рекомендует READ COMMITTED SNAPSHOT для большинства приложений, которым нужен ряд версий.

прочитайте эту отличную статью Microsoft:выбор уровней изоляции на основе управления версиями строк. В нем объясняются преимущества и издержки обоих уровней изоляции.

и вот более тщательный один: http://msdn.microsoft.com/en-us/library/ms345124 (SQL.90).aspx


enter image description here[![Таблица уровней изоляции][2]][2]

см. пример ниже:

Читать Зафиксированный Снимок

изменить свойство базы данных, как показано ниже

ALTER DATABASE SQLAuthority
SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO

занятие 1

USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 4
WHERE i = 1

секция 2

USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM   DemoTable
WHERE i = 1

Result-Query в сеансе 2 показывает старое значение (1, ONE), потому что текущая транзакция не зафиксирована. Это способ избежать блокировка и чтение зафиксированных данных.

занятие 1

COMMIT

секция 2

USE SQLAuthority
GO
SELECT *
FROM   DemoTable
WHERE i = 1

Result-Query в сеансе 2 не показывает строк, потому что строка обновляется в сеансе 1. Таким образом, мы снова видим зафиксированные данные.

Уровень Изоляции Моментальных Снимков

это новый уровень изоляции, который был доступен начиная с SQL Server 2005. Для этой функции требуется изменение в приложении так же должен использоваться новый уровень изоляции.

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

ALTER DATABASE SQLAuthority SET AllOW_SNAPSHOT_ISOLATION ON

теперь нам также нужно изменить уровень изоляции соединения, используя ниже

занятие 1

USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 10
WHERE i = 2

секция 2

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM   DemoTable
WHERE i = 2

результат-даже если мы изменили значение на 10, мы все равно увидим старую запись в сессии 2 (2, два).

теперь давайте зафиксируем транзакцию в сеансе 1

занятие 1

COMMIT

давайте вернемся к сеансу 2 и снова запустим select.

секция 2

SELECT *
FROM   DemoTable
WHERE i = 2

мы все равно увидим запись, потому что сеанс 2 заявил транзакцию с изоляцией моментального снимка. Если мы не завершим транзакцию, мы не увидим последнюю запись.

сессии 2

COMMIT
SELECT *
FROM   DemoTable
WHERE i = 2

теперь мы не должны видеть строку, поскольку она уже обновлена.

посмотреть: SQL Authority, Safari Книги Онлайн


никакое сравнение моментального снимка и зафиксированного чтения моментального снимка не завершено без обсуждения страшного исключения "конфликт обновления моментального снимка", которое может произойти в моментальном снимке, но не зафиксированное чтение моментального снимка.

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

Snapshot Read Committed не страдает от этой проблемы, поскольку он использует блокировку записи (пессимистические записи) и получает информацию о версии снимка всех зафиксированных данных на стат каждый оператор.

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


все еще актуально, начиная с комментариев Билла, я прочитал больше и сделал заметки, которые могут быть полезны кому-то еще.

по умолчанию одиночные операторы (включая "SELECT") работают над "committed" данными (Read COMMITTED), вопрос: они ждут, пока данные будут "простаивать" и останавливают других от работы при чтении?

настройка с помощью правой кнопки мыши DB "свойства - > параметры - > разное":

Параллелизм / Блокировка: Чтение Зафиксировано Снимок На [по умолчанию выключено, должно быть включено]:

  • используйте SNAPSHOT для выбора (чтения), не ждите других и не блокируйте их.
  • операция эффектов без изменения кода
  • ALTER DATABASE SET READ_COMMITTED_SNAPSHOT [ВКЛ|ВЫКЛ]
  • выберите имя, is_read_committed_snapshot_on из sys.базы данных

Согласованность: Разрешить Изоляцию Моментальных Снимков [по умолчанию выключено, спорно-OK off]:

  • разрешить клиенту запрашивать моментальный снимок через операторы SQL (транзакции).
  • код должен запросить моментальные снимки "транзакции" (например, установить транзакцию...)
  • ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION [ВКЛ|ВЫКЛ]
  • выберите имя, is_read_committed_snapshot_on из sys.базы данных

на вопрос: это не одно или другой между Read Committed Snapshot и разрешить изоляцию моментального снимка. Они есть два случая моментального снимка, и либо может быть включен или выключен независимо, с разрешить изоляцию моментального снимка немного больше расширенной темы. Разрешить изоляцию моментальных снимков позволяет коду сделать еще один шаг, контролируя Землю моментальных снимков.

проблема кажется ясной, если вы думаете об одной строке: по умолчанию система не имеет копии, поэтому читатель должен ждать, если кто – то еще пишет, и писатель также должен ждать, если кто-то еще читает-строка должна блокировать все время. Включение " Читать Зафиксировано Snapshot On "активирует БД для поддержки "копий моментальных снимков", чтобы избежать этих блокировок.

бредятина...

на мой взгляд, "читается зафиксированный снимок" должен быть " TRUE "для любых обычных баз данных MS SQLServer, и что это преждевременная оптимизация, что он отправляет" FALSE " по умолчанию.

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