Dun*_*can 10 sql-server isolation-level
试图完全理解SQL Server隔离级别 - 特别是可重复阅读.
我有一个启动事务的sproc并在某些数据周围放置一个光标(boo hiss).这可能是一大块数据,因此可能需要一段时间才能完成.
然后它将COMMIT或ROLLBACK.
在此期间,在事务关闭之前,如果有人调用导致某些受影响的行的方法为READ,我的理解是此方法将停止,直到第一个方法完成.然后他们将被提供数据(只要先没有超时)
我想我是对的,但问题是 - 我是吗?!
Qua*_*noi 19
REPEATABLE READ防止SELECTs提升他们放置的共享锁直到事务结束.
随着交易1的READ COMMITTED,你可以更新交易行2,你在交易中选择后1.
使用事务1为REPEATABLE 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)
| 归档时间: |
|
| 查看次数: |
8011 次 |
| 最近记录: |