可重复阅读 - 我理解这一点吗?

Dun*_*can 10 sql-server isolation-level

试图完全理解SQL Server隔离级别 - 特别是可重复阅读.

我有一个启动事务的sproc并在某些数据周围放置一个光标(boo hiss).这可能是一大块数据,因此可能需要一段时间才能完成.

然后它将COMMIT或ROLLBACK.

在此期间,在事务关闭之前,如果有人调用导致某些受影响的行的方法为READ,我的理解是此方法将停止,直到第一个方法完成.然后他们将被提供数据(只要先没有超时)

我想我是对的,但问题是 - 我是吗?!

Qua*_*noi 19

REPEATABLE READ防止SELECTs提升他们放置的共享锁直到事务结束.

随着交易1READ COMMITTED,你可以更新交易行2,你在交易中选择后1.

使用事务1REPEATABLE READ,在事务中选择事务后,无法更新事务中的行.21

场景:

阅读提交

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.
Run Code Online (Sandbox Code Playgroud)

可重复阅读

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.
Run Code Online (Sandbox Code Playgroud)

更新:

至于你的问题:in 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
Run Code Online (Sandbox Code Playgroud)

  • @Duncan - 不,你需要使用READ UNCOMMITTED(或在SELECT中应用WITH(NOLOCK)提示) (2认同)