2013-04-04 4 views
4

я создал базу данных под названием «test_isolation» и создал таблицу «человек» с даннымиSQL SERVER 2008 Уровень изоляции R2 транзакции Snapshot не работает должным образом

name age 
---- --- 
test1 1 
test2 2 
test3 3 
test4 4 
test5 5 
test6 6 

Теперь база данных изменена, чтобы разрешить изоляцию снимков в сессии1

ALTER DATABASE test_isolation 
SET ALLOW_SNAPSHOT_ISOLATION ON 
GO 

Теперь я создаю транзакцию в сессии 2

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 
GO 
BEGIN TRAN 
SELECT * FROM PERSON 
GO 
DELETE FROM PERSON WHERE name = 'test6' 
GO 
SELECT * FROM PERSON 
GO 

Результаты ожидаются. (Обратите внимание, мы не совершили эту сделку еще!)

Теперь я выполняю следующий запрос в сессии 3

SELECT * FROM PERSON 

запроса в сессии 3 продолжает работать бесконечно, который означает, что таблица заблокирована.

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

Уровень изоляции транзакций SNAPSHOT не предполагается блокировка стола вправо? Я делаю что-то неправильно или мое понимание транзакции SNAPSHOT Неверная изоляция?

Пожалуйста, помогите ..

ответ

8

Вы должны явно объявить SET TRANSACTION ISOLATION LEVEL SNAPSHOT в сессии три, в противном случае сессия 3 будет по-прежнему работать в качестве READ_COMMITTED и блока на обновлении.

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

ALTER DATABASE MyDatabase 
SET READ_COMMITTED_SNAPSHOT ON 
+3

+1 от http://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx: 'Установка опции READ_COMMITTED_SNAPSHOT ON позволяет получить доступ к версионированным строкам по умолчанию READ COMMITTED уровень изоляции. Если для параметра READ_COMMITTED_SNAPSHOT установлено значение OFF, вы должны явно установить уровень изоляции моментального снимка для каждого сеанса, чтобы получить доступ к версиям rows.' –