개발/database

[mssql] lock과 isolation level

가시죠 2021. 1. 17. 18:28
반응형

mssql은 특정 테이블을 select 하는 도중에 해당 테이블에 update문이나 insert문, delete문을 실행할 수 없다.

당연한 것 처럼 들리지만, oracle은 select와 상관없이 수행이 가능하다.

트랜잭션이 많은 업무시스템에서는 치명적으로 다가 올 수 있다.

가령, 테이블 몇개를 join 하여 통계 형태의 화면을 만들었다고 가정하고, 사용자가 그 화면을 자주 많이 조회한다면, 해당 테이블은 조회가 끝날때 까지 insert, update, delete를 할 수 없게 된다. 반대로 테이블에 insert, update, delete 가 완료되지 않을 경우 select를 할 수가 없다. 업무가 느려질테고, 타 시스템과 인터페이스 이후 데이터를 업데이트 및 select 한다고 했을때, timeout이 발생하여 데이터가 유실 될 수도 있다.

 

mssql로 프로젝트를 수행한다면 DBA와 협의하여 아래 옵션으로 oracle과 유사하게 동작하도록 할 수 있다.

2005버전이후 부터 가능

-- 데이터베이스 정보 확인 (0은 OFF, 1은 ON상태를 의미)
SELECT
    NAME, SNAPSHOT_ISOLATION_STATE, 
    SNAPSHOT_ISOLATION_STATE_DESC, 
    IS_READ_COMMITTED_SNAPSHOT_ON 
FROM SYS.DATABASES

-- SNAPSHOT 모드 사용 활성화
ALTER DATABASE [DATABASENAME] SET ALLOW_SNAPSHOT_ISOLATION ON;

-- READ COMMITTED SNAPSHOT 모드 활성화
ALTER DATABASE [DATABASENAME] SET READ_COMMITTED_SNAPSHOT ON;

 

PS. DB에 접속한 사용자가 많을 경우 위 명령 실행 시 오래 걸리거나 무한정 기다릴 수 있다. 접속하지 않은 새벽시간에 하던가 아니면 SSMS(SQL Server Management Studio)를 사용하면 좋다.

 

참고 : http://blog.naver.com/PostView.nhn?blogId=dontcryme&logNo=220123635232&redirect=Dlog&widgetTypeCall=true&directAccess=false

https://docs.microsoft.com/ko-kr/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

반응형