1일 1개념정리 (24년 8월~12월)/데이터베이스

1일1개 (74) - 내 통장이 사실은 무한 ATM ?

poetDeveloper 2024. 11. 7. 23:20

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#74. 직렬화

DB에서 말하는 직렬화는, 트랜잭션에서 동시성 제어와 관련된다. 두 트랜잭션이 동시에 실행될 때, 두 트랜잭션이 마치 하나씩 순차적으로 실행된 것 같은 결과를 보장하는 성질이다. 오늘은 직렬화에 대해 알아보자. (여기서 Serial을 직렬이라 생각하면 됨)

 

Serialization

보통 트랜잭션의 동시성 이야기할 때, 가장 많이 쓰이는 예시가 입금, 출금이다.

  • 현재 상태 : 100만원
  • A : 100만원 상태에서 50만원 입금
  • B : 100만원 상태에서 50만원 출금

A 실행이 10초 걸렸는데, B가 그 사이에 3~5초 구간에서 일을 처리했다면? A는 완료를 150만원으로 할테니, 출금은 출금대로 하고 최종 잔액은 150으로 찍히는 사고가 일어난다 ... 이를 방지하기 위해 트랜잭션의 직렬화를 이야기한다.

  • Serial Schedule : 트랜잭션들이 순차적으로 하나씩 실행되는 스케줄을 의미한다. 이 방식은 동시성 문제가 없지만 성능이 낮을 수 있다.
  • Serializable Schedule : 여러 트랜잭션이 병렬로 실행되지만, 그 실행 결과가 직렬 스케줄과 동일한 스케줄이다. 즉, 병행 실행된 트랜잭션들이 충돌이나 무결성 문제 없이 마치 순차적으로 실행된 것과 같은 결과를 낳는다면 그 스케줄은 직렬화 가능하다.

 

트랜잭션 병렬화 문제 (= 직렬화 안했을 때의 문제)

즉, 트랜잭션을 병렬적으로 실행하면 어떤 문제가 있는가 ??

  • Lost Update : 두 개의 트랜잭션이 같은 데이터를 동시에 갱신하여 변경 사항 중 하나가 덮어씌워지는 문제 발생.
  • Dirty Read  : 하나의 트랜잭션이 완료되지 않은 다른 트랜잭션의 변경 사항을 읽음.
  • Non-Repeatable Read : 동일한 트랜잭션 내에서 같은 데이터를 두 번 읽었을 때 데이터가 달라질 수 있다.
  • Phantom Read : 트랜잭션이 범위 쿼리를 두 번 수행할 때 사이에 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 결과가 달라지는 경우.

 

직렬화 구현

직렬화를 구현할 때 보통 OS의 동시성 문제처럼 Lock을 사용한다.

  • Locking : 공유 락과 exclusive 락을 사용하여 직렬화를 보장한다.
  • Timestamp Ordering : 각 트랜잭션에 타임스탬프를 부여하여 트랜잭션이 발생한 순서대로 처리되도록 한다. (직관적임)
  • 멀티버전 동시성 제어(= MVCC) : 여러 버전의 데이터를 유지하여 읽기와 쓰기를 병행하면서 직렬화 가능성을 보장한다.

 

반응형