본문 바로가기
Web/BackEnd

[Backend] 트랜잭션, Transaction (1)

by 희조당 2022. 10. 13.
728x90

✍️ 학습 목표

  • 트랜잭션
  • 트랜잭션 격리 수준

📌 트랜잭션

트랜잭션이란? 데이터베이스의 상태를 변화시키는 작업의 단위이다.

Data Manipulation Language(DML)을 사용해서 DB에 접근하는 것을 말한다.

 

🧷 트랜잭션 특징, ACID

  • Atomicity : 트랜잭션이 DB에 모두 반영되거나 반영되지 않아야 한다.
  • Consistency : 트랜잭션 이전과 이후의 데이터베이스의 상태는 동일해야 한다.
  • Isolation : 모든 트랜잭션은 다른 트랜잭션으로부터 독립적이다. 
  • Durability : 성공적으로 처리된 트랜잭션의 결과는 지속적으로 유지돼야 한다.

🧷 트랜잭션 연산

  • Rollback : 작업 도중 오류가 발생하면 이전 상태로 되돌린다.
  • Commit : 작업이 성공적으로 처리되면 데이터베이스에 반영한다.

📌 트랜잭션 격리 수준 (Isolation Level)

데이터베이스에서 ACID 특성에 따라 트랜잭션이 독립적으로 수행할 수 있게 한다.

제한(Locking)을 설정해서 독립성을 제공하는데, 무조건적인 Locking은 성능이 떨어질 수밖에 없다.

효율적으로 트랜잭션을 사용하기 위해서 제한 수준을 분리해야 한다.

 

🧷 Isolation Level 종류

1️⃣ Read Uncommitted (레벨 0)

  • SELECT 문장이 수행되는 동안 해당 데이터에 Lock이 걸리지 않는 수준
  • 처리 중이거나 커밋되지 않는 데이터를 다른 트랜잭션이 읽을 수 있다.
  • Dirty Read, Non-Repeatable Read, Phantom Read 현상 발생

2️⃣ Read Commited (레벨 1)

  • SELECT 문장이 수행되는 동안 해당 데이터에 Lock이 걸리는 수준
  • 커밋이 이루어진 데이터는 읽을 수 있다.
  • 대부분 DBMS의 Default Level
  • Non-Repeatable Read, Phantom Read 현상 발생

3️⃣ Repeatable Read (레벨 2)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Lock이 걸리는 수준
  • 트랜잭션 영역의 데이터를 다른 트랜잭션이 수정할 수 없다.
  • MySQL의 Default Level
  • Phantom Read 현상 발생

4️⃣ Serializable Read (레벨 3)

  • 트랜잭션이 완료될 때까지 SELECT 문장이 사용되는 모든 데이터에 Lock이 걸리는 수준
  • 트랜잭션 영역의 데이터를 다른 트랜잭션이 수정할 수도, 입력할 수도 없다.
  • 완벽한 읽기 일관성 모드를 제공한다.

격리 수준이 높다고 무조건적으로 좋은 것이 아니다. (Cost Issue)

동시성과 데이터 무결성은 반비례하기 때문에 필요에 맞춰서 사용해야 한다.

 

🧷 격리 수준에 따른 현상

1️⃣ Dirty Read (= Uncommitted Dependency)

  • 확정되지 않은 데이터를 읽는 경우를 말한다.
  • 트랜잭션 A가 커밋하지 않은 데이터를 트랜잭션 B가 읽음으로 커밋 이후 조회 결과가 달라지는 현상이다.

2️⃣ Non-Repeatable Read (= Inconsistent Analysis)

  • 한 트랜잭션에서 실행되는 같은 쿼리가 다른 결과를 반환할 때를 말한다.
  • 트랜잭션 A가 같은 쿼리를 두번 수행할 때, 그 사이 트랜잭션 B가 값을 변경함으로써 쿼리 결과가 다르게 나타나는 현상이다.

3️⃣ Phantom Read

  • 없던 데이터가 등장하는 경우를 말한다.
  • 트랜잭션 A가 어떤 데이터를 두 번 이상 읽을 때, 첫 쿼리에 없던 값이 다음 쿼리에서 나타나는 현상이다.

-Reference

https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/

댓글