이것저것

DB 동시성 제어 본문

Database

DB 동시성 제어

nays111 2021. 4. 17. 23:36

[동시성 제어란?]

다중 사용자 환경을 지원하는 DB 시스템에서 동시에 실행되는 여러 트랜잭션의 간섭으로 문제가 발생하지 않도록 트랜잭션의 실행 순서를 제어하는 기법이다.

 

일반적으로 동시성을 허용하면 일관성이 낮아진다.

 

동시성 제어의 목적

- 실행되는 트랜잭션의 수를 최대화

- 입력, 수정, 삭제, 조회 시 데이터의 무결성 유지

 

동시성을 위한 기본 요소 "직렬성"

직렬성 : 여러 트랜잭션들이 동시에 수행될 때, 마치 각각의 트랜잭션이 순차적으로 수행되는 것처럼 트랜잭션 간 간섭이 없다는 것을 의미한다.

격리 수준 (Isolation Level)이 높을 수록 직렬성 (Serializabilty)가 높다.


[동시성 제어를 하지 않을 경우의 문제점]

1. 갱신 분실 (Lost Update)

여러 트랜잭션들이 동일한 데이터를 동시에 갱신(update)하려는 경우에 발생

 

x : 1000

T _01(1번 트랜잭션) : x +=300

T_02(2번 트랜잭션) : x -=500

동시성 제어를 해주지 않으면

1) 1000 이라는 값이 T_01에 의해 1300이 된다.

2) 아직 write 이전 상태에서 T_02이 실행되기 때문에 T_02는 초기값 1000에 대해 -500 연산을 수행

3) T_01과 T_02가 순차적으로 값을 저장하여 덮어씌어지는 값의 손실


2. 연쇄 복귀 (Cascade Rollback)

여러 트랜잭션들이 데이터를 공유할 때, 특정 트랜잭션이 이전 상태로 복귀 (rollback)할 경우 아무 문제가 없는 다른 트랜잭션까지 연달아 복귀하게 되는 문제

 

x : 1500, y : 1000 

T _01 (트랜잭션 1번) : x+=300, y-=200

T_02 (트랜잭션 2번) : x *=3

 

T_01에 의해서 x가 1800이 된 이후 T_02가 실행되어 x를 3배하여 write이후 종료(commit)했다고 가정한다. 그리고 T_01이 Rollback 연산을 하여 다시 x를 초기값 1500으로 돌려놓으려 한다. 그러나 T_02는 이미 해당 트랜잭션을 commit하여 종료되었기 때문에 롤백을 할 수가 없는 문제를 "연쇄 복귀"라고 한다.


3. 모순성 (Inconsistency)

다른 트랜잭션들이 해당 항목 값을 갱신하는 동안 한 트랜잭션이 두 개의 항목 값 중 어떤 것은 갱신되기 전의 값을 읽고 다른 것은 갱신된 후의 값을 읽게 되어 데이터의 불일치가 발생

 

x : 1500, y : 1000

T _01 : x +=300, y+=300

T_02 : x =3, y=3

 

T_01이 수행되면서 x만 1800으로 증가시키고 write된 다음에 y를 수행하는 것이 아니라 T_02가 수행됨

그러면 T_02는 x,y의 각각 세 배를 해서 5400,3000이 되고 T_02는 종료(commit)한다.

다시 T_01이 y에 대한 연산을 수행하려 할 때, y가 1000이 아니라 3000이 되어 있어서 3000에 대한 연산을 수행하게 된다. 이렇게 x는 갱신 전의 값을, y는 갱신 후의 값을 읽어 데이터가 불일치하는 것을 "모순성" 이라고 한다.

 


[동시성 제어 기법의 종류]

'Database' 카테고리의 다른 글

MVCC (다중버전 동시성 제어)  (0) 2021.04.19
Locking (로킹)  (0) 2021.04.19
NOSQL 에 대하여  (0) 2021.04.17
Transaction - ACID  (0) 2021.02.17
2PL  (0) 2021.01.10
Comments