데이터베이스/데이터베이스

[Lock] MSSQL의 Lock과 트랜잭션 격리 개념

sseozytank 2023. 12. 28.

1.Lock 이란? 

- 데이터 베이스에서 동시성 제어를 할 때 사용하는 기술 

- 많게는 수천 명의 사용자(트랜잭션)가 액세스 하는 애플리케이션 환경에서 여러 요청을 동시에 처리 하기 위해 사용 

* Transcation
- 나누어지지 않는 최소한의 데이터 베이스 처리 단위
- SELECT, INSERT, UPDATE, DELETE 등과 같은 조작어를 사용하는 행동 

 

왜 사용할까 ? 

- 어떤 프로세스가 먼저 해당 자원을 수정할지 확실하지 않기 때문에 예측 불가능한 결과 발생 가능 

- 데드락 발생 가능 

* 데드락
- 두개 이상의 프로세스가 서로 가진 자원을 대기하면서 무한정 대기되는 상황
- SQL Server에서는 일반적으로 데드락 발생 시 가장 손해가 적은 트랙잭션을 실행하는 스레드를 희생자로 선택 

- 여러 프로세스가 동시에 자원을 수정하면, 데이터가 일관성 없이 변할 수 있음 

- 시스템의 성능 저하

- 예상치 못한 순서로 작업이 수행될 수 있음 

 

-> 따라서, 이러한 문제들을 해결하기 위해 프로세스나 스레드 간에 안전하게 자원을 공유하고 동기화 하는 것이 필요하고 Lock 메커니즘이 이것을 가능하게 한다. 

 

2.Lock Type 

  Exclusive Lock (배타적 잠금) Shared Lock (공유 잠금)
별칭 Wirte Lock Read Lock
설명 행이나 테이블을 완전히 잠그고 트랙잭션이 행을 UPDATE, DELECT, INSERT 할 수 있도록 함 
이 때 다른 트랙잭션은 잠금이 해제 될 때 까지 리소스에 접근을 할 수 없게 되며 기다리게 된다
트랜잭션이 잠겨있는 행이나 테이블을 읽어올 수 있으나 리소스 업데이트 작업을 할 수 없는 잠금. 공유 잠금 끼리는 동시 접근 가능
설정 방법 MSSQL에서는 기본적으로 트랜잭션이 완료 될 때 까지 데이터의 일관성을 보장하기 위해 수정 중인 데이터에 대해 배타적 잠금을 설정 SELECT 문에 의해 설정
해제 방법 잠금을 걸어 놓은 트랜잭션에서의 ROLLBACK 혹은 COMMIT 잠금을 걸어 놓은 트랜잭션에서의 ROLLBACK 혹은 COMMIT
예시 한 번에 한명의 친구만 놀이터에 들어갈 수 있다. 
A가 놀이터에 들어가면 그 동안에 다른 친구들은 놀이터에 들어갈 수 없는 것. 
도서관에서 여러 친구들이 같은 책을 함께 읽는 것. 그러나 한 친구가 책을 수정하거나 바꾸면 안됨. 그냥 읽기 만 해야함 
요약 하나의 자원을 한 번에 하나의 프로세스만 사용할 수 있게  여러 프로세스가 자원을 동시에 사용할 수 있게 하지만, 동시에 수정은 못하게 하는 것
* COMMIT
- 데이터베이스 트랜잭션에서의 변경 사항을 확정하고, 영구적으로 적용하는 작업. 
ex. 계좌에서 돈을 이체하는 작업이 모두 완료되면, COMMIT을 통해 이 변경 사항이 확정되고 계좌 잔액이 업데이트
* ROLLBACK
- 트랜잭션에서의 변경 사항을 취소하고, 이전의 상태로 되돌리는 작업. 트랜잭션이 중간에 오류가 발생하거나 사용자가 트랜잭션을 취소하고자 할 때 주로 사용되며, 롤백 사용 시 데이터 베이스는 이전의 일관된 상태로 돌아감
ex.DB에서 고객 정보를 업데이트하려는 트랜잭션이 중간에 오류가 발생하면, 롤백을 사용하여 해당 트랜잭션의 모든 변경 사항을 취소하고 이전의 고객 정보 상태로 복구할 수 있음

 

이렇게 LOCK 을 통해, 여러 트랜잭션이 동시에 접근하지 못하게 할 수 있다. 

 

하지만 트랙잭션 자체 격리를 통해서 특정 트랙잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정해 줄 수도 있다. 이게 바로 트랜잭션 격리인데, 격리 수준을 설정해 줄 수 있다.  즉, 락은 특정 자원에 대한 동시 접근을 제어하고 트랜잭션 격리는 트랜잭션 간의 격리 수준을 정의하여 일관성을 유지하는 것! 

 

3.트랜잭션 격리 수준 (isolation Level)  

  READ UNCOMMITTED READ COMMITED REPEATABLE READ SERIALIZABLE
격리 수준 1단계 2단계 3단계 4단계
설명 다른 작업이 아직 완전히 끝나지 않은 데이터를 읽을 수 있음 다른 작업이 완전히 끝난 후에만 해당 작업의 결과를 읽을 수 있음 한 번에 여러 번 같은 작업을 반복할 수 있음. 다른 작업이 결과를 바꾸지 않는다 여러 작업이 동시에 일어나도 순차적으로 일어나는 것처럼 격리
부작용 Dirty Read Non-Repeatable Read Phantom Read 성능 저하 유발 
사용 예시 은행 계좌 잔액 조회 시 다른 트랜잭션이 아직 커밋하지 않은 입금 내역을 조회하려고 할 때      

 

* Dirty Read (더티 리드)
- 하나의 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 현상
ex.친구 A가 은행에서 돈을 입금하고 있는데, 친구 B가 아직 A의 입금이 커밋되지 않은 상태에서 A의 잔액 조회
* Non-Repeatable Read (비반복 가능한 리드)
- 동일한 쿼리를 두 번 실행했을 때, 첫 번째와 두번째 결과가 다른 현상 의미 (데이터의 변경을 다룸)
ex.온라인 쇼핑몰에서 처음 상품 가격 조회시 시와 두번째 가격 조회 시 가격이 변경되는 경우
* Phantom Read (팬텀 리드) 
- 동일한 쿼리를 두 번 실행했을 때, 첫 번째와 두 번째 결과 사이에 다른 트랜잭션에 의해 새로운 데이터가 추가  (데이터의 추가를 다룸) 
ex.도서관에서 특정 카테고리의 책을 조회했을 때 첫 번째 조회에는 없던 다른 작가의 새로운 책이 나타남 

 

댓글