Попытка полностью понять Уровни изоляции SQL Server - особенно ПОВТОРЯЕМОЕ ЧТЕНИЕ.
У меня есть sproc, который запускает транзакцию и помещает курсор вокруг некоторых данных (шипение шиканья). Это может быть справедливым блоком данных, так может требовать времени, чтобы сделать.
Это будет тогда ФИКСИРОВАТЬ или ОТКАТЫВАТЬ.
В это время, прежде чем сделка была заключена, если кто-то называет метод, который заставляет некоторые строки пострадавших быть СЧИТАННЫМИ, мое понимание - то, что этот метод остановится, пока первый метод не завершен. Они будут тогда поданы данные (как долго, поскольку тайм-аут не происходит сначала),
Я думаю, что я прав, но вопрос - я?!
ПОВТОРЯЕМАЯ READ
предотвращает , ВЫБИРАЕТ
из подъема коллективных блокировок, которые они поместили до конца транзакции.
С транзакцией 1
как READ ФИКСИРОВАЛА
, вы можете обновлять строку в транзакции 2
после выбора ее в транзакции 1
.
С транзакцией 1
как ПОВТОРЯЕМАЯ READ
, вы не можете обновлять строку в транзакции 2
после выбора ее в транзакции 1
.
сценарии:
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.
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
Корректный.
полное описание А от MSDN:
Указывает, что операторы не могут читать данные, которые были изменены, но нет все же фиксировавший другими транзакциями и что никакие другие транзакции не могут изменить данные, которые были считаны текущая транзакция до тока транзакция завершается.
Коллективные блокировки помещаются во все данные читать каждым оператором в транзакция и сохранена до транзакция завершается. Это предотвращает другие транзакции от изменения любого строки, которые были считаны текущая транзакция. Другое транзакции могут вставить новые строки это соответствовать условиям поиска заявления сделаны током транзакция. Если ток транзакция затем повторяет оператор это получит новые строки, который результаты в фантомных чтениях. Поскольку коллективные блокировки сохранены в конец a транзакция вместо того, чтобы быть выпущенным в конце каждого оператора, параллелизм ниже, чем значение по умолчанию СЧИТАТЬ ФИКСИРОВАВШИЙ уровень изоляции. Использовать эта опция только при необходимости.