여러 사용자의 요구를 동시에 처리하기 위해 같은 데이터베이스에 대해 연산을 하는 트랜잭션을 동시에 처리해야한다. 동시적 처리, 병행적 연산에 따라 데이터베이스의 데이터가 업데이트되는 데 모든 사용자 요구에 대해 결과가 일관성을 가져야 한다. 따라서 일관성있는 병행처리를 위한 동시성 제어가 필요하다.
동시서성 제어의 목적
- 프로세스와 디스크 활용을 최대화한다.
- 단위 시간당 트랜잭션 처리 건수를 증가시킨다.
- 사용자 서비스 제공에 대한 응답시간을 최소화한다.
- 데이터베이스 공유 정도의 최대화를 보장한다.
- 데이터베이스 일관성을 유지한다.
동시성 제어의 문제
- 갱신 분실 Lost Update
2개 이상의 트랜잭션이 같은 데이터를 공유하여 갱신할 때, 한 트랙잭션의 갱신한 내용을 다른 트랜잭션에 의해 잃어버리는 현상
- 불일치성 Inconsistency
동시에 데이터베이스를 접근하여 연산 결과가 일관성을 잃어버리는 경우
- 연쇄 복구 Chaining Recovery
특정 트랜잭션이 복구가 필요한 경우 그 이후 연관된 트랜잭션에 대해서도 복구를 수행해야한다.
- 부정확한 요약 Incorrect Summary
한 트랜잭션이 데이터베이스를 업데이트하고 한 트랜잭션은 그룹 함수를 실행할 때 변경된 결과가 반영되지 않은 경우
트랜잭션
트랜잭션은 하나의 작업을 수행하기 위해 필요한 데이터베이스 연산을 모아둔 것을 의미하고 논리적인 작업의 단위가 된다. 트랜잭션은 일반적인 SQL 문의 명령문로 표현된 연산이라고 볼 수 있다.
트랜잭션의 4가지 특성 - ACID
1) 원자성 Atomicity
트랜잭션의 원자성은 트랜잭션을 구성하는 연산들이 모두 완전히 실행되거나 모두 실행되지 않음을 의미한다. 트랜잭션 도중 장애가 발생하면, 초기 시점으로 데이터베이스를 회복하여 원자성을 보장하도록 한다.
2) 일관성 Consistency
데이터베이스에 대한 작업 처리 결과가 트랜잭션의 내용에 일치하는 일관성을 가져야한다.
3) 격리성 Isolation
현재 수행중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과를 다른 트랜잭션이 접근할 수 없다.
4) 영속성 Durability
트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 어떠한 경우에도 손실되지 않고 영구적이어야한다.
Commit과 Rollback 연산
Commit: 트랜잭션이 성공적으로 수행되었음을 선언한다.
Rollback: 트랜잭션이 실패했음을 선언한다.
트랜잭션의 상태
1) 트랜잭션이 수행을 시작하면 활동 상태가 된다.
2) 트랜잭션이 마지막 연산을 처리하고 나면 부분 완료 상태가 된다.
3) 활동 상태나 부분완료 상태에서 장애나 다른 원인으로 더 이상 진행이 불가능하게되어 트랜잭션이 실패 상태가 된다.
4) 실패 상태의 트랜잭션은 rollback 연산의 실행으로 철회가 된다.
- 활동 Active
트랜잭션이 수행을 시작하여 혀재 수행 중인 상태를 활동 상태가 된다.
- 부분완료 Partially Committed
트랜잭션의 마지막 연산이 실행된 직후의 상태를 부분 완료 상태라하고 트랜잭션의 모든 연산을 처리한 상태이다.
연산 처리는 끝났지만 트랜잭션이 수행한 최종 결과를 데이터베이스에 아직 반영한 것은 아니므로 완료 상태가 될 수 있고 실패 상태가 될 수도 있다.
- 완료 Committed
트랜잭션이 성공적으로 완료되어 commit 연산을 실행한 상태를 완료 상태라고 한다. 완료 상태가 되면 수행 결과를 데이터베이스에 반영하고 트랜잭션이 종료된다.
- 실패 Failed
하드웨어, 소프트웨어의 문제나 트랜잭션 내부의 오류 등으로 장애가 발생하여 트랜잭션이 중단된 상태를 실패라고한다.
- 철회 Abort
트랜잭션의 수행이 실패하여 rollback 연산을 실행한 상태를 철회 상태라고 한다. 철회 상태가 되면 지금까지 실행한 모든 트랜잭션 연산을 취소하고 트랜잭션 수행되기 전의 데이터베이스 상태로 되돌리면서 트랜잭션이 종료된다.
트랜잭션 스케줄
트랜잭션이 병행처리될 때, 여러 트랜잭션들의 액션들의 실행 순서를 스케줄이라고한다. 액션은 데이터베이스 접근 연산들의 목록이며 스케줄의 목적은 트랜잭션들을 병행 처리하지만 결과적으로 직렬 처리와 같은 효과를 얻는 연산 순서를 만드는 것이다.
스케줄의 표현
Serial Schedule 직렬 스케줄
트랜잭션을 하나씩 순차적으로 처리한다. 가장 단순하고 병행처리의 오류가 없다.
Concurrent Scehdule 병행 스케줄
트랜잭션을 병행적으로 처리한다. 연산 결과의 일관성을 유지하기 어렵다.
Serializable Schedule 직렬화 스케줄
병행 처리를 기본으로 하지만 필요할 때 접근 제어를 하여 직렬성을 유지한다.
Complete Schedule 완전 스케줄
각 트랜잭션에 대한 철회와 완료를 포함하는 완전한 스케줄.
Conflict Schedule 충돌 스케줄
병행 처리중 제어가 필요한 스케줄로 직렬화 스케줄로 만들어야 한다.
충돌가능한 연산
- Write-Read 충돌 : 한 트랜잭션이 자료를 갱신하는 도중에 다른 트랜잭션이 자료를 읽는다. 오류 읽기 dirty read와 잘못된 요약 incorrect summary이 예상된다.
- Read-Write 충돌: 한 트랜잭션이 자료를 읽는 도중에 다른 트랜잭션이 자료를 갱신한다. dirty read와 무결성 제약 조건에 문제가 있을 수 있다.
- Write-Write 충돌: 한 트랜잭션이 자료를 갱신하는 도중에 다른 트랜잭션도 자료를 갱신한다. 한 트랜잭션의 결과가 반영되지 않은 lost update가 발생할 수 있다.
직렬화
직렬 처리를 실행한 결과를 낼 수 있도록 스케줄을 조정한다. 직렬 스케줄은 충돌 스케줄에 대해 직렬화하여 순차적으로 실행할 수 있게끔 만든다.
Locking 로킹
한 트랜잭션이 데이터를 처리하는 중에 다른 트랜잭션이 그 데이터를 접근하지 못 하도록 상호 배제(mutual exclusion) 하는 방법으로 직렬 가능성을 보장한다.
로깅 기법에서 한 트랜잭션이 데이터를 접근하기 위해 먼저 lock 연산을 실행하여 자원 독점권을 얻어온다. 다른 트랜잭션이 해당 데이터를 접근할 때 lock 연산으로 독점권을 얻어오려 하지만 실패하게 되고 순차적 실행을 보장하게 된다. 자원 독점권을 얻은 트랜잭션이 완료되고 독점권을 반납하여야 다른 트랜잭션이 접근할 수 있다.
로킹은 독점할 자원의 단위를 정할 수 있다. 가장 크게 데이터베이스부터 파일, 레코드, 필드 순으로 로킹의 단위가 된다. 단위가 클 수록 관리하기 쉽지만 병행성 수준이 낮아지며 반대로 단위가 작을수록 병행 처리율이 높아지며 대신 관리하기가 힘들다는 단점이 있다.
교착 상태
자원을 사용하는 두 연산이 각각 사용하려는 자원을 상대방이 소유하고 있고 반납하기를 무한정 기다리게 되는 상황을 교착상태라고 한다. 직렬화 과정에서 로킹 방법을 사용하게 되면 잘못된 사용으로 교착상태가 발생할 수 있다.
- 교착생태 예방기법
트랜잭션들이 연산을 수행하기 전에 필요한 자원를 모두 확보한 후 실행하게 하는 방법이다. 자원을 확보하지 못하면 기다렸다가 다시 시도를 하게된다. 한번 확보한 자원으로 연산의 완료까지 한번에 진행하고 교착상태의 가능성을 없앤다.
- 교착상태 회피 기법
트랜잭션이 자료가 필요한 시점에서 락을 이용하여 자료를 처리한다. 교착상태를 먼저 확인하는 기능이 있어야하며 교착상태가 예상되면 트랜잭션을 취소한다.
- 교착상태 탐지 및 해결 기법
모든 트랜잭션과 자원 관계에 대한 대기 그래프를 만들고 교착상태에 있는 지 검출한다. 그래프에 순환이 있으면 교착상태에 있다는 뜻이다.
'Computer Science 기본 지식 > 데이터 베이스' 카테고리의 다른 글
DB (6) 회복 (0) | 2021.05.14 |
---|---|
DB (6) 정규화 (0) | 2021.05.13 |
DB (5) SQL 언어 (0) | 2021.05.12 |
DB (4) 관계 데이터베이스 (0) | 2021.05.09 |
DB (3) 개체-관계 모델링 (0) | 2021.05.09 |