티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/45?category=1080971
4. 트랜잭션과 스케줄 종류
(1) 직렬 스케줄 (Serial Schedule)
- 순서대로 하나씩 트랜잭션을 실행하는 것
- 트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식
- 트랜잭션이 실행되는 동안 다른 트랜잭션의 영향을 받을 수 없어 (고립성) 모순이 발생하지 않음
(2) 직렬화 스케줄 (Serializable Schedule)
- 트랜잭션들이 동시에 자료 접근 연산들을 교차하며 실행시키면서도
결과가 직렬 스케줄과 동일한 스케줄
- 병행 제어, 직렬 스케줄 장점을 가진 것
- 병행 처리하지만 적절한 제어 조치를 취함으로 일관성을 유지함
- 병행 제어에서 필요한 스케줄
- 직렬성 (트랜잭션들의 처리 결과가 직렬 처리와 동일한 효과를 가지는 특성) 을 유지할 수 있음
5. 트랜잭션과 병행 처리
(1) 병행 처리의 특징과 문제점
- 병행 처리 : 직렬과는 다르게 여러 개의 요청을 동시에 처리
- 병행 처리의 문제점
- 갱신 유실 문제 : 두 트랜잭션이 동시에 동일한 자료를 갱신하는 것으로, 첫번째 갱신이 유실됨
- 오류 읽기 문제 : 갱신 도중에 다른 트랜잭션이 읽는 것으로, 낡은 자료가 읽혀짐
- 잘못된 요약 : 두 자료를 갱신하는 도중에 읽는 것으로, 요약 결과에 오류가 발생
- 무결성 제약 조건 : 두 자료의 제약 조건을 검사하지 않고 갱신하는 것으로, 일관성이 위반됨
(2) 병행 처리 제어
- 병행 처리 제어의 필요성
- 분실된 업데이트 문제 : 두 개의 트랜잭션이 동일한 아이템에 접근,
서로의 연산이 중첩될 시 올바르지 않은 값이 저장될 수 있음
- 임시 업데이트 문제 : 한 트랜잭션이 값을 업데이트하다가 실패할 경우
롤백 이전에 다른 트랜잭션이 값을 읽게 될 경우 오류 값을 읽게 됨
- 잘못된 요약 문제 : 한 트랜잭션이 aggregate 함수 (sum, max, min) 등을 실행 중인데
다른 트랜잭션이 이 값들 중 하나를 업데이트할 경우 업데이트 시점이 다름
(업데이트 이전 시점 값)
- 데이터베이스 병행 처리 제어의 목적
- 트랜잭션의 충돌을 방지하기 위해 고립성을 강제
- 데이터베이스의 일관성 보존
read-write
, write-write
충돌을 방지
→ 충돌하는 스케줄을 찾아 직렬화 스케줄을 만드는 것이 진정한 목적
6. 록킹
(1) 록킹의 정의
- 트랜잭션이 자료를 배타적으로 접근하는 방법
- 자료를 배타적으로 접근할 경우, 트랜잭션이 완료된 이후 다른 트랜잭션이 실행되어 직렬성이 확보됨
- 트랜잭션의
ACID
특성을 해치는 접근 연산은 주로 갱신임
(예시 : 읽기 연산은 자료 값을 바꾸지 않으나, 읽기 연산 중 갱신이 발생하면 잘못된 값을 읽게 됨)
(2) 종류
공유 록 (Shared Lock)
특정 자료 Q에 공유 록을 걸면 다른 트랜잭션이 이 자료를 갱신할 수 없음. 다만 읽혀질 수는 있음
배타 록 (Exclusive Lock)
자료를 기록할 때 배타 록 X를 걸어야 함.
록 X를 가진 트랜잭션은 자료를 읽고 갱신할 수 있음 (그 외에는 X)
또한 배타 록 X가 걸린 자료는 공유 록 S를 가진 트랜잭션들에 의해 읽혀질 수 없음
(3) 데드 록(Deadlock) 탐지 및 해결 기법
- 트랜잭션을 실행한 후 데드 록(Deadlock, 교착상태)에 걸려 있는 트랜잭션 중의 하나를 취소하여 해결
- 해결 부작용 : Starvaition, 특정 트랜잭션은 계속해서 기다려야 함
레퍼런스
http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98