[! [Таблица уровней изоляции] [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
Результат - Запрос в сеансе 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 , Safari Books Online