문제

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:

명세서는 수정되었지만 아직 다른 트랜잭션에 의해 커밋되지 않은 데이터를 읽을 수 없으며 현재 트랜잭션이 완료 될 때까지 현재 트랜잭션에서 읽은 데이터를 수정할 수 없음을 명시합니다.

공유 잠금은 거래의 각 명령문에 의해 읽은 모든 데이터에 배치되며 거래가 완료 될 때까지 유지됩니다. 이는 다른 트랜잭션이 현재 트랜잭션에서 읽은 행을 수정하는 것을 방지합니다. 다른 트랜잭션은 현재 트랜잭션에서 발행 된 명세서의 검색 조건과 일치하는 새 행을 삽입 할 수 있습니다. 현재 트랜잭션이 진술을 검색하면 새 행을 검색하여 팬텀이 읽습니다. 공유 잠금 장치는 각 명령문의 끝에서 릴리스되는 대신 거래의 끝까지 유지되기 때문에 동시성은 기본 판독 값 커밋 된 격리 수준보다 낮습니다. 필요한 경우에만이 옵션을 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top