반복 가능한 읽기 - 나는 이것을 이해하고 있습니까?
-
20-09-2019 - |
문제
SQL Server 격리 수준을 완전히 이해하려고 시도합니다.
트랜잭션을 시작하고 일부 데이터 (부 히스) 주위에 커서를 넣는 스프로크가 있습니다. 이것은 공정한 데이터 덩어리가 될 수 있으므로 시간이 걸릴 수 있습니다.
그런 다음 커밋하거나 롤백합니다.
이 기간 동안, 거래가 종료되기 전에, 누군가가 영향을받는 행 중 일부를 읽게하는 방법을 호출하면, 내 이해는 첫 번째 방법이 완료 될 때 까지이 방법이 중단된다는 것입니다. 그런 다음 데이터를 제공합니다 (시간 초과가 먼저 발생하지 않는 한)
나는 내가 옳다고 생각하지만 질문은 - 나는?!
해결책
REPEATABLE READ
방지합니다 SELECTs
공유 잠금 장치를 들어 올리는 것부터 거래가 끝날 때까지.
거래와 함께 1
~처럼 READ COMMITTED
, 너 ~할 수 있다 거래에서 행을 업데이트하십시오 2
트랜잭션에서 선택한 후 1
.
거래와 함께 1
~처럼 REPEATABLE READ
, 너 할 수 없습니다 거래에서 행을 업데이트하십시오 2
트랜잭션에서 선택한 후 1
.
시나리오 :
Commited를 읽으십시오
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.
업데이트:
질문 : 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
다른 팁
옳은.
전체 설명 MSDN:
명세서는 수정되었지만 아직 다른 트랜잭션에 의해 커밋되지 않은 데이터를 읽을 수 없으며 현재 트랜잭션이 완료 될 때까지 현재 트랜잭션에서 읽은 데이터를 수정할 수 없음을 명시합니다.
공유 잠금은 거래의 각 명령문에 의해 읽은 모든 데이터에 배치되며 거래가 완료 될 때까지 유지됩니다. 이는 다른 트랜잭션이 현재 트랜잭션에서 읽은 행을 수정하는 것을 방지합니다. 다른 트랜잭션은 현재 트랜잭션에서 발행 된 명세서의 검색 조건과 일치하는 새 행을 삽입 할 수 있습니다. 현재 트랜잭션이 진술을 검색하면 새 행을 검색하여 팬텀이 읽습니다. 공유 잠금 장치는 각 명령문의 끝에서 릴리스되는 대신 거래의 끝까지 유지되기 때문에 동시성은 기본 판독 값 커밋 된 격리 수준보다 낮습니다. 필요한 경우에만이 옵션을 사용하십시오.