2015-03-02 4 views
0

Изучение уровней изоляции и блокировки, более конкретно READ COMMITTED vs. READ COMMITTED SNAPSHOT.Уровни изоляции транзакций - блокировка таблиц в базе данных Azure SQL

В SQL Server 2014, уровень изоляции по умолчанию READ COMMITTED, и если я бегу

BEGIN TRANSACTION 
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK); 
WAITFOR DELAY '03:00:00' 
ROLLBACK TRANSACTION 

, а затем в новом соединении

SELECT * FROM Person.Person 

второй запрос будет блокировать и повесить.

В Azure SQL, однако, уровень изоляции READ COMMITTED SNAPSHOT, который, кажется, позволяет читать данные Person.Person с TABLOCKX + HOLDLOCK'ed tx в ожидании.

Вопрос: Как воспроизвести сценарий блокировки, возможно, с помощью подсказок, заставляя первый SELECT полностью блокировать таблицу, а на READ COMMITTED SNAPSHOT? - как и в Azure SQL, и не может быть изменен.

Я попытался:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
SELECT top 1 * FROM Person.Person WITH (TABLOCKX, HOLDLOCK); 
BEGIN TRANSACTION 
... 

и

BEGIN TRANSACTION 
SELECT top 1 * FROM Person.Person WITH (READCOMMITTED); 
... 

Спасибо.

ответ

0

Я не могу воспроизвести описанную вами ситуацию. Когда я включаю уровень изоляции в моментальный снимок в обычном (2012 не-Azure SQL Server DB) с этим: установите allow_snapshot_isolation на и создайте таблицу dbo.x5 и заполните ее. В одном сеансе я бегу:

начать транзакции

ВЫБРАТЬ сверху 1 * FROM dbo.x5 С (TABLOCKX, HOLDLOCK);

WAITFOR DELAY '03: 00: 00'

ROLLBACK TRANSACTION

и в другом я бегу

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

начать транзакции

выберите * от dbo.x5 с (readcommitted)

Вторая сессия висит.

Если я не добавить «readcommitted» намекают он читает (изоляция ничего не блокирует снимок читает.)

Согласно литературе основное различие между Azure и не-лазурь по умолчанию значения параметров, но как только он замок что он действует одинаково.

Смежные вопросы