Читать совершены против моментальный снимок уровня изоляции



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



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



спасибо

768   4  

4 ответов:

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

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

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

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

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

Смотрите пример ниже:

Read Committed Snapshot

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

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, один), потому что текущая транзакция не зафиксирована. Это способ избежать блокировка и чтение зафиксированных данных также.

занятие 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, два).

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

занятие 1

COMMIT

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

секция 2

SELECT *
FROM   DemoTable
WHERE i = 2

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

сессии 2

COMMIT
SELECT *
FROM   DemoTable
WHERE i = 2

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

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

никакое сравнение Snapshot и Snapshot Read Committed не завершено без обсуждения страшного исключения "snapshot update conflict", которое может произойти в Snapshot, но не Snapshot Read Committed.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.