동시성 제어를 알기 전에 기본적인 사전 지식과 왜 동시성 제어를 해야 하는지부터 설명드리겠습니다.

트랜잭션과 격리성

트랜잭션이란 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다. 이 작업 단위는 데이터베이스에서 데이터를 검색하거나 추가, 수정, 삭제 등의 조작을 수행하는 것을 포함합니다. 하나의 트랜잭션은 여러 개의 데이터베이스 조작 작업을 수행할 수 있지만, 그 작업들은 모두 하나의 논리적인 작업으로 간주됩니다.

트랜잭션의 4가지 원칙

  1. 원자성(Atomicity): 트랜잭션은 하나의 논리적인 작업 단위로서, 그 작업들이 모두 성공적으로 완료되거나, 아니면 전혀 수행되지 않아야 합니다. 즉, 트랜잭션 내에서 하나의 작업이라도 실패하면, 해당 트랜잭션 전체가 취소되고 이전 상태로 롤백됩니다.
  2. 일관성(Consistency): 트랜잭션 수행 전과 수행 후의 데이터베이스 상태가 일관성을 유지해야 합니다. 즉, 트랜잭션 수행 전에 정의된 일련의 규칙과 제약 조건이 모두 만족되어야 합니다.
  3. 격리성(Isolation): 여러 개의 트랜잭션이 동시에 수행되더라도, 각각의 트랜잭션은 서로 영향을 주지 않고 독립적으로 수행되어야 합니다.
  4. 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 해당 작업의 결과는 영구적으로 데이터베이스에 반영되어야 합니다. 즉, 시스템이 장애가 발생하더라도, 해당 작업의 결과는 영구적으로 유지되어야 합니다.

트랜잭션의 격리성

격리성(Isolation)은 데이터베이스에서 여러 개의 트랜잭션이 동시에 수행될 때, 각각의 트랜잭션이 다른 트랜잭션의 작업 결과에 영향을 받지 않도록 하는 것을 의미합니다.

트랜잭션 격리성은 동시에 실행되는 트랜잭션들 사이에서 발생할 수 있는 각종 문제들을 해결하기 위해 필요합니다. 여러 개의 트랜잭션이 동시에 실행될 때, 아래와 같은 문제들이 발생할 수 있습니다.

  1. lost update: 두 개 이상의 트랜잭션이 같은 데이터를 업데이트하려고 할 때, 마지막으로 커밋한 트랜잭션만이 업데이트를 유지하고 이전 트랜잭션에서 수행한 업데이트는 사라지는 문제입니다
  2. Dirty Read
  1. Non-Repeatable Read (반복 불가능한 읽기)
  1. Phantom Read (유령 읽기)

위와 같은 문제들을 해결하기 위해 각각의 트랜잭션들이 독립적으로 수행되어야 하며, 서로 영향을 주지 않도록 격리되어야 합니다. 이를 위해 데이터베이스에서는 다양한 격리 수준을 제공하며, 각각의 수준에 따라 트랜잭션 격리성이 보장됩니다. 대표적인 격리 수준으로는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등이 있습니다.

  1. READ UNCOMMITTED(미확정 읽기): 말 그대로 커밋되지 않은 데이터도 읽을수 있는 가장 낮은 수준의 격리입니다. 다른 트랜잭션이 변경한 데이터를 읽을 수 있으며, 해당 데이터가 아직 COMMIT되지 않았을 경우에는 Dirty Read 문제가 발생할 수 있습니다. 이 때문에, READ UNCOMMITTED 격리 수준은 사용되지 않는 것이 좋습니다.