yoursyun

트랜젝션 격리수준 (TRANSACTION ISOLATION LEVEL) 본문

database/mssql

트랜젝션 격리수준 (TRANSACTION ISOLATION LEVEL)

yoursyun 2013. 4. 12. 11:18

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

반응형