|  |     | 
| (같은 사용자의 중간 판 하나는 보이지 않습니다) | 
| 1번째 줄: | 1번째 줄: | 
|  | [[분류:데이터베이스]][[분류:기술사 기출]] |  | #넘겨주기 [[데이터베이스 병행제어]] | 
|  | ;Transaction Concurrency Control
 |  | 
|  | ;여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법
 |  | 
|  |   |  | 
|  | == 병행제어의 목적 ==
 |  | 
|  | * 데이터베이스 일관성 유지
 |  | 
|  | * 일관성을 유지하면서,
 |  | 
|  | ** 데이터베이스 공유 최대화
 |  | 
|  | ** 시스템 활용도 최대화
 |  | 
|  | ** 사용자 응답시간 최소화
 |  | 
|  |   |  | 
|  | == 트랜잭션 동시 접근 시 발생 가능한 현상 ==
 |  | 
|  | * '''Dirty Write'''
 |  | 
|  | ** 갱신 분실(Lost Update)라고도 한다.
 |  | 
|  | ** 같은 데이터에 동시에 두 개 이상의 트랜잭션이 값을 바꾸고자 함
 |  | 
|  | ::{| class="wikitable"
 |  | 
|  | |-
 |  | 
|  | ! T1 !! T2
 |  | 
|  | |-
 |  | 
|  | | SELECT age FROM user WHERE id = 1; || 
 |  | 
|  | |-
 |  | 
|  | |  || SELECT age FROM user WHERE id = 1;
 |  | 
|  | |-
 |  | 
|  | | UPDATE user SET age = 20 WHERE id = 1;
 |  | 
|  | COMMIT ;
 |  | 
|  | ||
 |  | 
|  | |-
 |  | 
|  | |  || UPDATE user SET age = 30 WHERE id = 1;
 |  | 
|  | COMMIT;
 |  | 
|  | |}
 |  | 
|  | * '''Dirty Read'''
 |  | 
|  | ** 비완료 의존성(Uncommitted Dependency)라고도 함
 |  | 
|  | ** 아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함
 |  | 
|  | ::{| class="wikitable"
 |  | 
|  | |-
 |  | 
|  | ! T1 !! T2
 |  | 
|  | |-
 |  | 
|  | | UPDATE user SET age = 20 WHERE id = 1; ||  
 |  | 
|  | |-
 |  | 
|  | |  || SELECT age FROM user WHERE id = 1;
 |  | 
|  | |-
 |  | 
|  | | ROLLBACK; || 
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | * '''Non-repeatable Read'''
 |  | 
|  | ** 모순성(Inconsistency)이라고도 한다
 |  | 
|  | ** 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨
 |  | 
|  | :[[파일:Non-Repeatable Read.png|border]]
 |  | 
|  | * '''Phantom Read'''
 |  | 
|  | ** 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨
 |  | 
|  | :[[파일:Phantom Read.png]]
 |  | 
|  |   |  | 
|  | == 트랜잭션 고립화 수준 ==
 |  | 
|  | ;Transaction Isolation Level(ANSI/ISO SQL92)
 |  | 
|  | * 동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
 |  | 
|  | {| class="wikitable"
 |  | 
|  | |-
 |  | 
|  | ! 단계 !! 명명 !! 설명
 |  | 
|  | |-
 |  | 
|  | | 레벨0
 |  | 
|  | (Level0) 
 |  | 
|  | || Read Uncommitted 
 |  | 
|  | || 
 |  | 
|  | * 트랜잭션 처리 중인 데이터를 읽을 수 있음
 |  | 
|  | * [발생 가능 현상]
 |  | 
|  | ** Dirty Read
 |  | 
|  | ** Non-Repeatable Read
 |  | 
|  | ** Phantom Read
 |  | 
|  | |-
 |  | 
|  | | 레벨1
 |  | 
|  | (Level1) 
 |  | 
|  | || Read Committed 
 |  | 
|  | || 
 |  | 
|  | * 트랜잭션이 커밋되어 확정된 데이터만 읽을 수 있음
 |  | 
|  | * (대부분의 DBMS에서 기본으로 채택하는 레벨)
 |  | 
|  | * [발생 가능 현상]
 |  | 
|  | ** Non-Repeatable Read
 |  | 
|  | ** Phantom Read
 |  | 
|  | |-
 |  | 
|  | | 레벨2
 |  | 
|  | (Level2) 
 |  | 
|  | || Repeatable Read 
 |  | 
|  | || 
 |  | 
|  | * 선행 트랜잭션이 데이터를 읽는 경우 종료 전까진 갱신/삭제 불가
 |  | 
|  | * [발생 가능 현상]
 |  | 
|  | ** Phantom Read
 |  | 
|  | |-
 |  | 
|  | | 레벨3
 |  | 
|  | (Level3) 
 |  | 
|  | || Serializable 
 |  | 
|  | || 
 |  | 
|  | * 선행 트랜잭션이 데이터를 읽는 경우 종료 전까진 갱신/삭제/삽입 불가
 |  | 
|  | * 완벽한 정합성을 보장하는 레벨
 |  | 
|  | |}
 |  | 
|  |   |  | 
|  | == 병행제어가 실패 시 발생 가능한 현상 ==
 |  | 
|  | ;병행제어가 이루어지지 않을 경우 문제점
 |  | 
|  | * '''갱신분실 (Lost update)'''
 |  | 
|  | ** 두개 이상의 Transaction 수행하는 과정에서 연산결과의 일부가 없어지는 현상
 |  | 
|  | * '''현황파악오류 (Dirty Read)'''
 |  | 
|  | ** 트랜잭션이 완료되지 않은 중간 과정을 다른 트랜잭션에서 참조함으로써 부정확한 값을 읽게 되는 현상
 |  | 
|  | ** 비완료 의존성(Uncommitted Dependency): 두개 이상의 Transaction 수행시 먼저 수행된 Transaction이 실패한후 회복되기 이전에 다음 실행되는 Transaction이 실패한 값을 참조하게 되는 현상
 |  | 
|  | * '''모순성 (Inconsistency)'''
 |  | 
|  | ** 두개 이상의 Transaction 수행해서 얻은 결과가 일관성이 없이 서로 다른 현상
 |  | 
|  | * '''연쇄복귀 (Cascade Rollback)'''
 |  | 
|  | ** 두개 이상의 Transaction이 수행되던중 한개의 Transaction이 취소될 때 나머지 다른 Transaction도 연쇄적으로 취소되는 현상
 |  | 
|  | ** 회복 불가(Unrecoverable): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상
 |  | 
|  |   |  | 
|  | == 병행제어 기법 ==
 |  | 
|  | * '''[[트랜잭션 로킹|로킹(Locking)]]'''
 |  | 
|  | ** 트랜잭션이 어떤 데이터에 접근하고자 할 때 로킹 수행
 |  | 
|  | ** 로킹이 되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
 |  | 
|  | ** 트랜잭션은 로킹이 된 데이터에 대해서만 연산 수행
 |  | 
|  | ** 로킹 단위: 필드, 레코드, 파일, 데이터베이스 모두 로킹 단위가 될 수 있음
 |  | 
|  | ** '''로킹 단위가 크면'''
 |  | 
|  | *** 관리하기 용이(로킹 오버헤드 감소)하지만 병행성 수준(동시성 수준) 낮아짐
 |  | 
|  | ** '''로킹 단위가 작으면'''
 |  | 
|  | *** 병행성(동시성 수준)이 높아지지만 관리가 까다로움(로킹 오버헤드 증가)
 |  | 
|  | * '''[[2단계 로킹 규약|2단계 로킹 규약(Two-Phase Locking Protocol)]]'''
 |  | 
|  | ** Lock과 Unlock이 동시에 이루어지면 일관성이 보장되지 않으므로 Lock만 가능한 단계와 Unlock만 가능한 단계를 구분
 |  | 
|  | ** 확장단계: 새로운 Lock은 가능하고 Unlock은 불가능하다.
 |  | 
|  | ** 축소단계: Unlock 은 가능하고 새로운 Lock은 불가능하다.
 |  | 
|  | ** 직렬가능성을 보장한다.
 |  | 
|  | ** [[교착상태]]가 발생할 수 있다
 |  | 
|  | * '''타임스탬프(Time Stamp)'''
 |  | 
|  | ** 데이터에 접근하는 시간을 미리 정하여서 정해진 시간(Time Stamp)의 순서대로 데이터에 접근 하여 수행
 |  | 
|  | ** 직렬가능성을 보장한다.
 |  | 
|  | ** [[교착상태]]가 발생하지 않는다.
 |  | 
|  | ** 연쇄복귀(Cascading Rollback)를 초래할 수 있음
 |  | 
|  | * '''[[낙관적 병행제어|낙관적 병행제어(Optimistic Concurrency Control)]]'''
 |  | 
|  | ** 트랜잭션 수행 동안은 어떠한 검사도 하지 않고, 트랜잭션 종료 시에 일괄적으로 검사
 |  | 
|  | ** 트랜잭션 수행 동안 그 트랜잭션을 위해 유지되는 데이터 항목들의 지역 사본에 대해서만 갱신
 |  | 
|  | ** 트랜잭션 종료 시에 동시성을 위한 트랜잭션 직렬화가 검증되면 일시에 DB로 반영
 |  | 
|  | * '''[[다중 버전 병행제어|다중 버전 병행제어(Multi-version, Concurrency Control)]]'''
 |  | 
|  | ** 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
 |  | 
|  | ** 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성
 |  |