REPEATABLE READ
не позволяет SELECTs
снять общие блокировки, которые они установили, до конца транзакции.
С транзакцией 1
как READ COMMITTED
вы можете обновить строку в транзакции 2
после ее выбора в транзакции 1
.
С транзакцией 1
как REPEATABLE 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
, SELECTs
не будет блокировать друг друга даже с REPEATABLE 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