동시성 제어를 알기 전에 왜 동시성 제어를 해야 하는지부터 설명드리겠습니다.
트랜잭션과 격리성
트랜잭션이란 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다. 이 작업 단위는 데이터베이스에서 데이터를 검색하거나 추가, 수정, 삭제 등의 조작을 수행하는 것을 포함합니다. 하나의 트랜잭션은 여러 개의 데이터베이스 조작 작업을 수행할 수 있지만, 그 작업들은 모두 하나의 논리적인 작업으로 간주됩니다.
트랜잭션의 4가지 원칙
- 원자성(Atomicity): 트랜잭션은 하나의 논리적인 작업 단위로서, 그 작업들이 모두 성공적으로 완료되거나, 아니면 전혀 수행되지 않아야 합니다. 즉, 트랜잭션 내에서 하나의 작업이라도 실패하면, 해당 트랜잭션 전체가 취소되고 이전 상태로 롤백됩니다.
- 일관성(Consistency): 트랜잭션 수행 전과 수행 후의 데이터베이스 상태가 일관성을 유지해야 합니다. 즉, 트랜잭션 수행 전에 정의된 일련의 규칙과 제약 조건이 모두 만족되어야 합니다.
- 격리성(Isolation): 여러 개의 트랜잭션이 동시에 수행되더라도, 각각의 트랜잭션은 서로 영향을 주지 않고 독립적으로 수행되어야 합니다.
- 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 해당 작업의 결과는 영구적으로 데이터베이스에 반영되어야 합니다. 즉, 시스템이 장애가 발생하더라도, 해당 작업의 결과는 영구적으로 유지되어야 합니다.
트랜잭션의 격리성
격리성(Isolation)은 데이터베이스에서 여러 개의 트랜잭션이 동시에 수행될 때, 각각의 트랜잭션이 다른 트랜잭션의 작업 결과에 영향을 받지 않도록 하는 것을 의미합니다.
트랜잭션 격리성은 동시에 실행되는 트랜잭션들 사이에서 발생할 수 있는 각종 문제들을 해결하기 위해 필요합니다. 여러 개의 트랜잭션이 동시에 실행될 때, 아래와 같은 문제들이 발생할 수 있습니다.
1. Dirty Read
- 트랜잭션 A가 데이터를 수정한 후에 트랜잭션 B가 아직 수정되지 않은 데이터를 읽을때 트랜잭션 A가 롤백될 경우, 트랜잭션 B가 읽은 데이터는 일종의 "가짜 데이터"가 되어버립니다.
2. Non-Repeatable Read (반복 불가능한 읽기)
- 트랜잭션 A가 같은 Key를 가진 데이터를 두 번 이상 읽는 도중에, 트랜잭션 B가 그 데이터를 수정 또는 삭제하는 경우 트랜잭션 A는 두 번째 읽기에서 수정된 데이터를 읽게 되므로, 처음과 다른 값을 읽게 됩니다.(일관성x)
3. Phantom Read (유령 읽기)
- A트랜잭션이 동일한 조건으로 두 번 이상 쿼리를 실행할 때, B트랜잭션이 중간에 데이터를 추가할경우 A트랜잭션에서 첫 번째 쿼리에서는 없던 데이터가 두 번째 쿼리에서 나타나는 경우입니다. 이 경우, 두 번째 쿼리에서 조회된 데이터는 첫 번째 쿼리에서는 보이지 않았던 데이터가 되므로, 트랜잭션의 일관성이 깨집니다.
위와 같은 문제들을 해결하기 위해 각각의 트랜잭션들이 독립적으로 수행되어야 하며, 서로 영향을 주지 않도록 격리되어야 합니다. 이를 위해 데이터베이스에서는 다양한 격리 수준을 제공하며, 각각의 수준에 따라 트랜잭션 격리성이 보장됩니다. 대표적인 격리 수준으로는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등이 있습니다.
- READ UNCOMMITTED(미확정 읽기): 말 그대로 커밋되지 않은 데이터도 읽을수 있는 가장 낮은 수준의 격리입니다. 다른 트랜잭션이 변경한 데이터를 읽을 수 있으며, 해당 데이터가 아직 COMMIT되지 않았을 경우에는 Dirty Read 문제가 발생할 수 있습니다. 이 때문에, READ UNCOMMITTED 격리 수준은 사용되지 않는 것이 좋습니다.
- READ COMMITTED(확정 읽기): 트랜잭션에서 읽은 데이터는 해당 트랜잭션이 완료될 때까지 COMMIT되지 않습니다. 이 때문에, Dirty Read 문제는 발생하지 않지만, Non-Repeatable Read, Phantom Read 문제는 여전히 발생할 수 있습니다.
- REPEATABLE READ(반복 가능한 읽기): 트랜잭션이 실행되는 동안 읽은 데이터는 해당 트랜잭션이 완료될 때까지 변경되지 않습니다. 이 때문에, Non-Repeatable Read 문제는 발생하지 않지만, Phantom Read 문제는 여전히 발생할 수 있습니다.
- SERIALIZABLE(직렬화 가능): 가장 높은 격리 수준으로, 트랜잭션에서 읽은 데이터는 다른 트랜잭션이 해당 데이터를 변경하거나 삽입할 수 없습니다. 이 때문에, 데이터베이스에서 격리성이 가장 높은 수준으로 보장됩니다. 하지만, SERIALIZABLE 격리 수준은 다른 격리 수준에 비해 높은 성능 비용을 가집니다.
동시성 제어의 목적중 하나가 Serializable을 보장해 주는것이고, 데이터의 무결성과 일관성 등을 보장해 주는것입니다.
Dirty Read, Non-Repeatable Read, Phantom Read와 같은 문제를 해결하기 위해 트랜잭션간의 실행 순서를 제어해야 하며, 이를 위해 동시성 제어가 필요하게 됩니다.
마지막으로 동시성 제어를 알기전에 동시성과 병렬성의 차이를 통해 동시성이 무엇인지 알고 동시성 제어를 알아보겠습니다.
동시성 vs 병렬성
동시성(Concurrency) | 병렬성(Parallelism) |
동시에 실행되는 것 같이 보이는 것 | 실제로 동시에 여러 작업이 처리되는 것 |
싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식 | 멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식 |
한번에 많은 것을 처리 | 한번에 많은 일을 처리 |
논리적인 개념 | 물리적인 개념 |
예시) 스프링 코드를 작성하는 도중 이해가 안돼서 인강과 코드 작성을 번갈아 가며 코드를 작성 |
예시) 코드를 작성하면서 같이 노래를 들음 |
위 두개의 사진은 동시성과 병렬성의 차이를 직관적으로 보여줍니다.
동시성은 싱글 코어에서 context switch를 통해 여러개의 스레드를 번갈아 가면서 실행하며 마치 동시에 동작하는 것처럼 보여주고, 병렬성은 물리적으로 여러개의 멀티코어에서 작업을 나눠서 동시에 처리한다는 차이가 있습니다.
'CS 지식' 카테고리의 다른 글
2022년 3회 정보처리기사 실기 기출문제 (0) | 2023.07.19 |
---|---|
2022년 2회 정보처리기사 실기 기출문제 (1) | 2023.07.16 |
2022년 1회 정보처리기사 실기 기출문제 (0) | 2023.07.16 |
동시성 제어(Concurrency Control)란 (0) | 2023.03.14 |