병행 수행과 병행 제어

bong·2023년 12월 17일
0

오라클 DB

목록 보기
7/8

병행 수행이란 여러개의 트랜잭션을 동시에 수행하는 것을 의미한다.
병행 제어란 병행 수행 시 같은 데이터에 접근하여 연산을 실행해도 문제가 발생하지 않고 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 수행을 제어하는 것을 의미한다.

1. 병행 수행 시 문제점

트랜잭션 1트랜잭션 2발생 가능한 문제점병행 수행 방법
ReadRead문제 없음-
WriteWrite- 갱신 분실
- 모순성
- 연쇄 복귀
허용 불가
ReadWrite- 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 ReadNon Repeatable ReadPhantom Read
READ UNCOMMOTTED1OOO
READ COMMITTED2XOO
REPEATABLE READ4XXO
SERIALIZABLE8XXX

READ UNCOMMITTED

  • SELECT문에 대해서는 NO LOCK

READ COMMITTED

  • 타 트랜잭션 데이터는 락 호환성 규칙에 따름

REPEATABLE READ

  • 타 트랜잭션은 자신의 데이터를 갱신할 수 없도록 한다.

SERIALIZABLE

  • 실행중인 트랜잭션은 다른 트랜잭션으로부터 완벽히 분리됨
profile
늅늅

0개의 댓글