Search

2016년 1월 13일 수요일

[Database] [MSSQL] 데이터베이스를 READ_COMMITTED_SNAPSHOT 모드로 변경하기.

* 예를 들어, DDDD라는 데이터베이스를 사용하는 두 사용자가 있다. Martin과 Oskar로 하자.

#1. Martin은 A테이블에 트랜잭션을 열어서 Insert 혹은 Update 작업을 한다. (아직 Commit이나 Rollback을 하지 않은 상태)
#2. 이때, Oskar가 A테이블을 Select하려고 하면, A테이블에는 Lock이 걸려있다. (아직 Martin의 작업이 끝나지 않았으므로) 그래서 Oskar의 쿼리는 Blocking상태에 빠지게 되고, Martin의 쿼리가 끝나길 하염없이 기다리는 상태가 된다.

* 여기에서 만약, Oskar는 Martin의 작업과 관계없이, 항상 가장 마지막에 Commit된 A테이블의 데이터만 가져와도 된다. 라고 한다면 데이터베이스를 다음과 같이 설정하면 위와같은 블락에 걸리지 않게된다.
 참조 : https://technet.microsoft.com/ko-kr/library/ms175095(v=sql.105).aspx
-- 데이터베이스 정보 확인 (0은 OFF, 1은 ON상태를 의미)
SELECT NAME, SNAPSHOT_ISOLATION_STATE,
SNAPSHOT_ISOLATION_STATE_DESC, IS_READ_COMMITTED_SNAPSHOT_ON
FROM SYS.DATABASES

-- READ_COMMITTED_SNAPSHOT모드 ON
ALTER DATABASE DDDD SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

-- READ_COMMITTED_SNAPSHOT모드 OFF
ALTER DATABASE DDDD SET READ_COMMITTED_SNAPSHOT OFF

* 추가적으로, Oskar가 만약 Martin의 트랜젝션이 Commit 되건 Rollback이 되건 그냥 지금 현재 변화하는 데이터를 보고싶다면? 현재의 Oskar가 열어놓은 세션에 다음과 같은 명령어로 확인할 수 있게된다.
 (총 4가지 옵션이 있고, 추가 설명들은 아래의 참조사이트를 참고하자.)
참조 : https://support.microsoft.com/ko-kr/kb/601430

-- SET옵션 확인
DBCC USEROPTIONS

-- READ UNCOMMITTED 모드로 변경.
-- 주의 : SQL Server가 Default로 사용하는 Isolation Level은 READ COMMITTED.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


댓글 없음:

댓글 쓰기