REPEATABLE READ
SELECTs
トランザクションが終了するまで、配置した共有ロックを解除できないようにします。
transaction 1
asREAD COMMITTED
を使用すると、 transaction で選択した行を transaction で更新できます。2
1
transaction 1
asREPEATABLE READ
を使用すると、 transaction で行を選択した後で、その行を transaction で更新することはできません。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