yoursyun
트랜젝션 격리수준 (TRANSACTION ISOLATION LEVEL) 본문
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
격리수준을 설정 하지 않고 조회 시
READ COMMITTED 이며, 커밋되지 못한 행 조회시 LOCK 상태가 된다.
READ UNCOMMITTED
커밋되지 않은 데이터를 읽을수 있다.
만일 데이터가 1 -> 2로 업데이트 되고, 트랜잭션이 아직 커밋되지 않았다면,
2를 읽을 수 있다. ( ROLL BACK 의 위험성을 인지 해야 함 )
REPEATABLE READ
커밋되지 않은 데이터를 읽을수 없다. LOCK 상태가 된다.
READ UNCOMMITTED 차이점. 다른 트랜젝션이 해당 행을 수정할 수 없다.
공유잠금이라고 한다.
SNAPSHOT
ALLOW_SNAPSHOT_ISOLATION 데이터베이스 옵션을 ON으로 설정해야 한다.
트랜잭션은 시작되기 전에 커밋된 데이터 수정 내용만 인식한다.
1 -> 2 업데이트 중인 트랜젝션은 1로 읽는다.
SERIALIZABLE
커밋되지 못한 행 조회시 LOCK 상태가 된다.
범위잠금이며, 검색 조건 내 데이터를 수정하려고 하면 수정하려는 트랜젝션은
LOCK 상태가 된다.
< Lock 해결 및 해당 SP를 를 실행한는 프로세스 죽이기 >
Lock을 찾기 위해서 sp_lock 프로시져를 실행 후, Lock Mode 가 "X" 을 것을 찾는다.
(일반적으로 "S" 또는 "IS" 많이 일어나지만, 운영 상에는 큰 이슈는 되지 않는다. )
그래서 sp_lock으로 조회되는 세션 중 Lock Mode 가 "X"인 것의 SPID 값을 가지고 와서,
예를 들면 SPID 값이 "56"일 경우,
dbcc inputbuffer(56);
위와 같은 명령어를 실행해서 보면, EventInfo 컬럼에 어떤 SQL 문이 Lock 을 일으키고 있는지 확인할 수 있다.
또한 운영상에 문제가 되는 SPID 를 다음의 구문으로 없앨 수 있다. KILL 56