Data Analysis 데이터 분석/SQL 통한 Database 관리

각각의 트랙잭션이 영향 주는 칼럼이 같을 때 값이 어떻게 되니

Queen Julia 2024. 8. 18. 16:55

두 개의 트랜잭션이 동시에 동일한 칼럼을 수정하려고 할 때, 트랜잭션이 서로 영향을 주지 않도록 데이터베이스 시스템은 여러 가지 방법으로 이를 관리합니다. 이러한 상황은 **동시성 제어**와 관련이 있으며, 데이터베이스의 트랜잭션 격리 수준에 따라 결과가 달라집니다.

### 가능한 시나리오
1. **트랜잭션 1**이 특정 칼럼 값을 업데이트하고 있는 동안, **트랜잭션 2**도 동일한 칼럼을 업데이트하려고 시도합니다.
2. 두 트랜잭션이 동시에 실행될 수 있는 환경에서, 데이터베이스는 각 트랜잭션이 해당 칼럼에 대해 서로 다른 값을 설정하려고 할 때 어떻게 처리할지를 결정합니다.

### 격리 수준에 따른 처리 방식
1. **Read Uncommitted (읽기 미완료)**:
   - **트랜잭션 1**이 데이터를 업데이트하고 아직 커밋하지 않은 상태에서도 **트랜잭션 2**는 그 값을 읽거나 업데이트할 수 있습니다.
   - 이 경우, **트랜잭션 2**가 더러운 데이터를 읽을 수 있으며, 최종 값은 누가 먼저 커밋하느냐에 따라 달라질 수 있습니다. 만약 **트랜잭션 1**이 먼저 커밋된다면 그 값이 반영되고, 그 후 **트랜잭션 2**가 커밋되면 **트랜잭션 2**의 값이 반영됩니다.

2. **Read Committed (읽기 완료)**:
   - **트랜잭션 1**이 데이터를 커밋하기 전에는 **트랜잭션 2**가 그 데이터를 읽을 수 없습니다.
   - 이 경우, **트랜잭션 2**는 **트랜잭션 1**이 커밋한 후의 데이터를 읽게 됩니다. **트랜잭션 2**가 업데이트를 시도하면 **트랜잭션 1**이 커밋한 데이터를 기반으로 업데이트하게 됩니다.

3. **Repeatable Read (반복 가능 읽기)**:
   - **트랜잭션 1**이 특정 칼럼을 읽고 나서 업데이트를 시도할 때, **트랜잭션 2**는 **트랜잭션 1**이 완료되기 전까지 그 값을 수정할 수 없습니다.
   - **트랜잭션 2**는 **트랜잭션 1**이 완료될 때까지 대기하게 되며, **트랜잭션 1**이 커밋된 후에야 업데이트를 할 수 있습니다.

4. **Serializable (직렬화 가능)**:
   - 트랜잭션들은 사실상 순차적으로 실행되는 것처럼 동작합니다.
   - **트랜잭션 1**이 칼럼 값을 업데이트하고 커밋하기 전까지 **트랜잭션 2**는 그 칼럼에 접근할 수 없습니다.
   - 이 경우, **트랜잭션 2**는 **트랜잭션 1**이 완료된 후에 그 값을 읽거나 업데이트할 수 있으며, 각 트랜잭션은 서로 완전히 독립적으로 실행됩니다.

### 최종 값
- **누가 나중에 커밋하느냐에 따라 최종 값이 결정됩니다.**
  - 만약 **트랜잭션 1**이 먼저 커밋하고 **트랜잭션 2**가 나중에 커밋한다면, **트랜잭션 2**의 값이 최종적으로 저장됩니다.
  - 반대로, **트랜잭션 2**가 먼저 커밋되고 **트랜잭션 1**이 나중에 커밋되면 **트랜잭션 1**의 값이 최종적으로 저장됩니다.