[SQL Server] 동시성(Concurrency)

2022. 2. 12. 18:30카테고리 없음

동시성 제어(Concurrency Control)

DBMS는 다수의 사용자를 가정한다. 따라서 동시에 작동하는 다중 트랜잭션의 상호 간섭 작용에서 데이터베이스를 보호할 수 있어야 한다.

동시성을 제어하기 위해 Lock 기능을 사용한다.

여러 사용자가 데이터를 동시에 액세스하는 것처럼 보이지만 내부적으로는 하나씩 실행되도록 트랜잭션을 직렬화하는 것이다.

또한 set transacion 명령어를 써서 트랜잭션 격리성 수준을 조정할 수 있다.

 

SQL Server의 경우

👉 기본 트랜잭션 격리성 수준인 Read Committed 상태에선 레코드를 읽고 다음 레코드로 이동하자마자 공유 Lock을 해제

👉 Repeatable Read에서는 트랜잭션을 커밋할 때까지 공유 Lock 유지

 

동시성 제어가 어려운 이유

👉 동시성(Concurrency)과 일관성(Consistency)은 트레이드 오프(Trade Off) 관계

👉 즉, 동시성을 높이려고 Lock의 사용을 최소화하면 일관성 유지 어렵고, 일관성을 높이려고 Lock을 적극적으로 사용하면 동시성 저하

 

가. 일반적인 Locking 매커니즘의 문제점

👉 읽기 작업에 공유 Lock을 사용하는 일반적인 Locking 매커니즘에서는 읽기 작업과 쓰기 작업이 서로 방해를 일으키기 대문에 종종 동시성에 문제 발생

👉 Read Committed는 값을 읽는 순간에만 공유 Lock을 걸었다가 다음 레코드로 이동할 때 Lock을 해제하기 때문에 데이터의 일관성이 없어지는 경우 발생

👉 트랜잭션 격리성 수준을 Repeatable Read으로 올리면 트랜잭션 쿼리가 진행되는 동안 읽은 레코드는 공유 Lock이 계속 유지되며 심지어 쿼리가 끝나고 다음 쿼리가 진행되는 동안에도 유지된다.

 

나. 다중버전 동시성 제어

매커니즘

- 데이터를 변경할 때마다 그 변경사항을 Undo 영역에 저장해 둔다.

- 데이터를 읽다가 쿼리(또는 트랜잭션) 시작 시점 이후에 변경된(변경이 진행 중이거나 이미 커밋된) 값을 발견하면, Undo 영역에 저장된 정보를 이용해 쿼리(또는 트랜잭션) 시작 시점의 일관성 있는 버전(CR Copy)을 생성하고 그것을 읽는다.

 

👉 쿼리 도중에 배타적 Lock이 걸리는, 즉 변경이 진행 중인 레코드를 만나더라도 대기하지 않기 때문에 동시성 측면에서 매우 유리하다.

👉 사용자에게 제공되는 데이터의 기준 시점이 쿼리(또는 트랜잭션) 시작 시점으로 고정되기 때문에 일관성 측면에서 유리

 

그렇다고 장점만 있는 거은 아니다.

Undo 블록 I/O, CR Copy 생성, CR 블록 캐싱 같은 부가적인 작업 때문에 생기는 오버헤드도 무시할 수 없다.

 

다. 문장 수준 읽기 일관성(Statement-Level Read Consistency)

다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 단일 SQL 문 내에서 일관성 있게 값을 읽는 것

 

라. 트랜잭션 수준 읽기 일관성

다른 트랜잭션에 의해 데이터의 추가, 변경, 삭제가 발생하더라도 트랜잭션 내에서 일관성 있게 값을 읽는 것