Повторяемое Чтение - я понимаю это право?

Попытка полностью понять Уровни изоляции SQL Server - особенно ПОВТОРЯЕМОЕ ЧТЕНИЕ.

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

Это будет тогда ФИКСИРОВАТЬ или ОТКАТЫВАТЬ.

В это время, прежде чем сделка была заключена, если кто-то называет метод, который заставляет некоторые строки пострадавших быть СЧИТАННЫМИ, мое понимание - то, что этот метод остановится, пока первый метод не завершен. Они будут тогда поданы данные (как долго, поскольку тайм-аут не происходит сначала),

Я думаю, что я прав, но вопрос - я?!

10
задан Duncan 14 January 2010 в 16:22
поделиться

2 ответа

ПОВТОРЯЕМАЯ READ предотвращает , ВЫБИРАЕТ из подъема коллективных блокировок, которые они поместили до конца транзакции.

С транзакцией 1 как READ ФИКСИРОВАЛА , вы можете обновлять строку в транзакции 2 после выбора ее в транзакции 1 .

С транзакцией 1 как ПОВТОРЯЕМАЯ READ , вы не можете обновлять строку в транзакции 2 после выбора ее в транзакции 1 .

сценарии:

READ ФИКСИРОВАЛА

1 SELECT -- places a shared lock and immediately lifts it.
2 UPDATE -- places an exclusive lock. Succeeds.
1 SELECT -- tries to place a shared lock but it conflicts with the exclusive lock placed by 2. Locks.

ПОВТОРЯЕМАЯ READ

1 SELECT -- places a shared lock and keeps it
2 UPDATE -- tries to places an exclusive lock but it's not compatible with the shared lock. Locks
1 SELECT -- the lock is already placed. Succeeds.

Обновление:

Что касается вас вопрос: в SQL Server, ВЫБИРАЕТ , не заблокирует друг друга даже с ПОВТОРЯЕМАЯ READ , так как коллективные блокировки, которые они помещают, совместимы друг с другом:

CREATE TABLE t_lock (id INT NOT NULL PRIMARY KEY, value INT NOT NULL)
INSERT
INTO    t_lock
VALUES (1, 1)

-- Session 1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
DECLARE @id INT
DECLARE cr_lock CURSOR DYNAMIC
FOR
SELECT  id
FROM    t_lock
OPEN    cr_lock
FETCH   cr_lock

id
--
1

-- Session 2

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
DECLARE @id INT
DECLARE cr_lock CURSOR DYNAMIC
FOR
SELECT  id
FROM    t_lock
OPEN    cr_lock
FETCH   cr_lock

id
--
1

-- Session 1

DEALLOCATE cr_lock
COMMIT

-- Session 2

DEALLOCATE cr_lock
COMMIT
19
ответ дан 3 December 2019 в 18:33
поделиться

Корректный.

полное описание А от MSDN:

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

Коллективные блокировки помещаются во все данные читать каждым оператором в транзакция и сохранена до транзакция завершается. Это предотвращает другие транзакции от изменения любого строки, которые были считаны текущая транзакция. Другое транзакции могут вставить новые строки это соответствовать условиям поиска заявления сделаны током транзакция. Если ток транзакция затем повторяет оператор это получит новые строки, который результаты в фантомных чтениях. Поскольку коллективные блокировки сохранены в конец a транзакция вместо того, чтобы быть выпущенным в конце каждого оператора, параллелизм ниже, чем значение по умолчанию СЧИТАТЬ ФИКСИРОВАВШИЙ уровень изоляции. Использовать эта опция только при необходимости.

2
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: