Подтвердить что ты не робот

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

Может кто-нибудь, пожалуйста, помогите мне понять, когда использовать уровень изоляции SNAPSHOT над READ COMMITTED SNAPSHOT в SQL Server?

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

Спасибо

4b9b3361

Ответ 1

READ COMMITTED SNAPSHOT делает оптимистичные чтения и пессимистические записи. Напротив, SNAPSHOT делает оптимистичные чтения и оптимистичные записи.

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

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

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

Ответ 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

Результат. Запрос в сеансе 2 показывает старое значение (1, ONE), потому что текущая транзакция НЕ совершена. Это способ избежать блокировки и чтения преданных данных.

Сессия 1

COMMIT

Сессия 2

USE SQLAuthority
GO
SELECT *
FROM   DemoTable
WHERE i = 1

Результат. Запрос в сеансе 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, TWO).

Теперь давайте совершить транзакцию в сеансе 1

Сессия 1

COMMIT

Вернемся к сеансу 2 и снова запустите выбор.

Сессия 2

SELECT *
FROM   DemoTable
WHERE i = 2

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

Сессия 2

COMMIT
SELECT *
FROM   DemoTable
WHERE i = 2

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

Смотрите: Служба SQL, Интернет-книги Safari

Ответ 3

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

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

Настройка через правый щелчок DB "Свойства → Параметры → Разное":

Concurrency/Блокировка: прочитано снятый снимок вкл. [по умолчанию отключен, должен быть включен]:

  • Используйте SNAPSHOT для выбора (чтения), не ждите других и не блокируйте их.
  • Работа с эффектами без изменения кода
  • ALTER DATABASE SET READ_COMMITTED_SNAPSHOT [ON | OFF]
  • SELECT name, is_read_committed_snapshot_on FROM sys.databases

Консистенция: разрешить изоляцию снимков [по умолчанию выключено, дискуссионно - ОК выключено]:

  • Разрешить клиенту запрашивать SNAPSHOT через SQL-запросы (транзакции).
  • Код должен запрашивать моментальные снимки транзакции (например, SET TRANSACTION...)
  • ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION [ON | OFF]
  • SELECT name, is_read_committed_snapshot_on FROM sys.databases

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

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

Рамблинг на...

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

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