트랜잭션과 병행성 제어

ideafy·2024년 10월 11일

CS

목록 보기
8/17

트랜잭션이란?

데이터 베이스 객체들에 대한 일련의 판독(Read)또는 기록(Write)

트랜잭션의 특성

원자성(Atomicity)

트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않음을 보장

일관성(Consistency)

실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지됨을 보장

격리성(Isolation)

트랜잭션 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장

지속성(Durability)

성공적으로 수행된 트랜잭션은 영구적으로 데이터베이스에 반영됨을 보장


트랜잭션의 격리성(Isolation)

트랜잭션의 격리성은 여러 트랜잭션이 동시에 실행될 때, 서로 간섭하지 않도록 보장하는 중요한 특성이다. 이를 통해 데이터의 일관성을 유지할 수 있다. 격리성을 구현하기 위해 Lock(잠금)이 사용되며, 트랜잭션 간의 충돌이나 데이터 무결성 문제를 방지하는 역할을 한다.

Lock(잠금)

잠금은 트랜잭션이 데이터를 읽거나 수정할 때, 해당 데이터에 대한 보호를 제공한다. 잠금 방식에는 공유 잠금(Shared Lock)배타적 잠금(Exclusive Lock)이 있다.

공유 잠금(Shared Lock): 데이터를 읽을 수는 있지만, 다른 트랜잭션이 해당 데이터를 수정할 수는 없다.

Dirty Read: 한 트랜잭션이 데이터를 업데이트하는 도중, 다른 트랜잭션이 그 데이터를 읽어 부정확한 정보를 조회하는 현상이 발생할 수 있다.

Repeatable Read: 동일 트랜잭션 내에서 동일한 데이터를 여러 번 조회해도 결과가 변하지 않도록 보장하는 격리 수준이다. 다만, Phantom Read가 발생할 수 있는데, 이는 다른 트랜잭션의 삽입이나 삭제로 인해 같은 쿼리가 서로 다른 결과를 반환하는 현상이다.

배타적 잠금(Exclusive Lock): 데이터를 수정할 수는 있지만, 읽기와 쓰기가 모두 제한된다. 이는 데이터의 무결성을 강력하게 보호하지만 성능에 영향을 줄 수 있다.


실제 DB 트랜잭션에서의 Lock은?

대부분의 트랜잭션에서 읽기(R)의 경우 Shared Lock을 적용하고 쓰기(W)의 경우 Exclusive Lock을 적용한다.

Shared Lock - SELECT에 적용됨
Exclusive Lock - UPDATE, DELETE, INSERT 등의 갱신 쿼리에 적용됨

학생 테이블에 삽입할 때 일어날 수 있는 문제점

학번 이외의 테이블 인덱스 역할의 컬럼이 있으면, 2개 이상의 사용자가 insert 시 트랜잭션 오류가 발생할 수 있다. → 동시성 제어

Student
sidstudent_id
120190001
220190002
@id = SELECT MAX(sid) FROM Student;
INSERT INTO (@id + 1, ...);
# 2개 이상의 사용자가 동시에 삽입 시 
# 같은 @id를 얻게 될 수 있다.

race condition 상황이 발생했을 때, 운영체제는 동시성 제어를 위해 뮤텍스, 세마포어로 critical section에 접근해 수행할 트랜잭션에 대한 잠금(Locking)을 수행한다.

Isolation Level

트랜잭션 격리 수준(Transaction Isolation Level)은 트랜잭션들이 얼마나 고립되어 있는지를 나타내는 것으로, 특정 트랜잭션이 다른 트랜잭센에 의해 변경된 데이터를 볼 수 있도록 허용할 지 말지를 결정한다.

  • SERIALIZABLE (Level 3)

    • 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독
    • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있음
    • 인덱스에 Locking을 함
    • 다른 트랜잭션이 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입 불가능
    • 모든 이상현상 방지
    • 넓은 범위에 Lock이 걸려 데이터의 무결성을 지킬 수는 있지만 성능이 떨어진다.
  • REPEATABLE READ (Level 2)

    • 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독
    • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, Index Locking은 하지 않음
    • 다른 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제 불가능
    • Phantom Read 발생 가능
    • MySQL
  • READ COMMITTED (Level 1)

    • 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독
    • T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, T가 판독한 Row는 다른 트랜잭션이 접근가능
    • Commit 된 데이터만 다른 트랜잭션에서 읽을 수 있음
    • Non-Repeatable Read, Phantom Read 발생 가능
    • MsSQL, Oracle, Postgres
  • READ UNCOMITTED (Level 0)

    • 트랜잭션 T는 진행중인 트랜잭션이 만들어 놓은 변경도 판독할 수 있음
    • Dirty Read, Non-Repeatable Read, Phantom Read 발생 가능
    • Commit 되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있음
    • 데이터가 왜곡될 가능성이 있지만 속도가 가장 빠르다.
LevelDirty ReadNon-Repeatable ReadPhantom
READ UNCOMMITTED가능성 있음가능성있음가능성있음
READ COMMITTED불가가능성 있음가능성 있음
REPEATABLE READ불가불가가능성 있음
SERIALIZABLE불가불가불가
profile
재밌게 공부하고 싶어요

0개의 댓글