병행 수행이란 여러개의 트랜잭션을 동시에 수행하는 것을 의미한다.
병행 제어란 병행 수행 시 같은 데이터에 접근하여 연산을 실행해도 문제가 발생하지 않고 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것을 의미한다.
1. 병행 수행 시 문제점
트랜잭션 1 | 트랜잭션 2 | 발생 가능한 문제점 | 병행 수행 방법 |
---|
Read | Read | 문제 없음 | - |
Write | Write | - 갱신 분실 - 모순성 - 연쇄 복귀 | 허용 불가 |
Read | Write | - DirtyRead 현상 - Non Repeatable Read 현상 - Phantom Read 현상 | 허용 또는 불가 선택 |
2. WRITE/WRITE 상황
2.1 갱신 분실
- 트랜잭션 변경 연산의 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화되는 것

2.2 모순성
- 일관성 없는 상태의 데이터를 가져와 연산하여 모순된 결과 발생

2.3 연쇄 복귀
- 트랜잭션이 완료되기 전에 장애가 발생하여 ROLLBACK 연산을 수행하게 되면 장애 발생 전에 이 트랜잭션이 변경한 데이터를 가져가서 변경연산을 수행한 다른 트랜잭션에도 ROLLBACK 연산을 연쇄적으로 수행해야 하는 것

2.4 상황 해결방법
- 직렬 스케줄
- 각 트랜잭션들의 연산을 순차적으로 실행시키는 것
- 각 트랜잭션을 순차적으로 수행하여 병행 수행이 아님
- 비직력 스케줄
- 인터리빙 방식을 이용하여 트랜잭션들을 병행하여 수행시키는 것
- 하나의 트랜잭션이 완료되기 전에 다른 트랜잭셔느이 연산 실행 가능
- 직렬 가능 스케줄 - 직렬 스케줄과 같이 정확한 결과를 생성하는 비직렬 스케줄
- 로킹
- 한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 끝낼 때까지 다른 트랜잭션이 그 데이터에 접근하지 못하도록 상호 배제하는 것
3. READ/WRITE 상황
3.1 DirtyRead
- 트랜잭션2가 아직 COMMIT을 수행하지 않은 상태에서 트랜잭션1이 트랜잭션2의 갱신된 데이터 값을 읽는 경우
(트랜잭션1에서 트랜잭션2가 갱신한 데이터값을 읽은 경우)
- 트랜잭션2가 COMMIT할 경우 문제가 없지만, 트랜잭션2가 ROLLBACK할 경우 트랜잭션1은 잘못된 값 읽음
3.2 Non Repeatable Read
- 같은 데이터를 반복해서 읽기 불가능한 상황
- 트랜잭션1이 Read, 트랜잭션2가 데이터를 변경하고 다시 트랜잭션1이 Read하는 경우 서로 다른 값을 읽음
3.3 Phantom Read
- 일기 작업을 반복할 경우 이전에 없던 데이터가 나타나는 현상
- 트랜잭션1이 Read, 트랜잭션2가 데이터를 삽입하고 다시 트랜잭션1이 Read하는 경우 서로 다른 값을 읽음
3.4 해결방법
- 트랜잭션1에서 트랜잭션2가 COMMIT하기 전에 갱신된 데이터를 가져올지, 갱신되기 전의 데이터를 가져올지 사용자가 선택하도록 한다.
- 사용자가 선택하는 방법을 4단계로 나누어 선택
기호상수 | 상수값 | Dirty Read | Non Repeatable Read | Phantom Read |
---|
READ UNCOMMOTTED | 1 | O | O | O |
READ COMMITTED | 2 | X | O | O |
REPEATABLE READ | 4 | X | X | O |
SERIALIZABLE | 8 | X | X | X |
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
- 타 트랜잭션은 자신의 데이터를 갱신할 수 없도록 한다.
SERIALIZABLE
- 실행중인 트랜잭션은 다른 트랜잭션으로부터 완벽히 분리됨