데이터베이스는 여러 트랜잭션을 번갈아가며 함께 처리합니다. 그러다 보니 서로 얽히는 경우도 생기는데, 이러한 병행수행의 문제점에 대해서 알아보겠습니다.
[ Contents ]
1. 동시성 제어 (병행 제어)
동시 실행되는 여러 트랜잭션의 작업에서 문제가 발생하지 않도록 제어하는 기법
트랜잭션은 동시에 실행될 수 있으나, 결과는 독립적으로 연속되어 실행된 결과와 같아야 합니다. (트랜잭션의 고립성/격리성)
흔히 수강신청이나 선착순 예약을 떠올리시면 이해하기 쉽습니다.
동시에 여러 트랜잭션이 수행되지만, 실행순서대로 직렬성이 보장되어야 합니다. 그리고 응답시간을 최소화하면서 데이터의 무결성과 일관성을 보장하는 기법이 '동시성 제어(병행 제어)'라고 보면 되겠습니다.
2. 병행 수행의 문제점
운영체제와 마찬가지로, DB도 여러 트랜잭션을 번갈아 수행하는 인터리빙(Interleaving) 방식을 지원합니다.
해당 방식은 같은 데이터를 변경하는 트랜잭션이 동시에 실행될 때 문제가 됩니다. 예를 들어, 계좌이체를 동시에 여러 번 했을 때 잔액이 없음에도 돈이 이체될 수 있는 거죠. (마이너스 통장..?)
1) 갱신 분실(Lost Update)
실행 중인 트랜잭션이 변경한 결과를 다른 트랜잭션이 덮어쓴 상황
2) 비완료 의존성 (Uncommitted Dependency)
실패된 트랜잭션 작업이 취소되기 전에, 다른 트랜잭션이 참조한 경우
3) 모순성 (Inconsistency)
연산 중간에 다른 트랜잭션이 값을 변경하는 경우
트랜잭션이 실행되는 중에, 다른 트랜잭션이 끼어들어서 다른 값을 변경하는 경우입니다. 갱신 분실처럼 변경한 값에 덮어쓰진 않지만, 다른 값을 변경함으로써 데이터베이스의 일관성(규칙, 제약조건)이 훼손될 수 있습니다.
예를 들어 결제대금 납부 중에 사용자가 예약을 취소하면, 결제는 완료되었으나 예약은 취소상태가 됩니다. 그러면 데이터베이스 일관성이 훼손될 수 있죠.
4) 연쇄 복귀 (Cascading Rollback)
한 트랜잭션이 Rollback 할 때, 연관된 트랜잭션도 같이 Rollback 못하는 경우
비완료 의존성과도 연관이 있습니다. 실패한 트랜잭션의 결과를 가져와서 이미 실행을 마친 경우, Commit을 했기 때문에 다시 Rollback 할 수 없습니다.
'CS > DB' 카테고리의 다른 글
[DB] 데이터 웨어하우스와 데이터 마트, 그리고 ETL이란? (0) | 2023.04.25 |
---|---|
[DB] 데이터베이스 병행(동시성) 제어 기법: 로킹, 기본적 2PL (0) | 2023.04.25 |
[DB] 데이터베이스 로그 회복 기법 (즉시 갱신, 지연 갱신) (0) | 2023.04.25 |
[DB] 데이터베이스 장애와 회복 기법 (Redo 재실행, Undo 취소) (0) | 2023.04.25 |
[DB] 트랜잭션의 특성(ACID, 원자성/일관성/고립성/영속성)과 상태 (0) | 2023.04.24 |
댓글