데이터베이스 병행제어 편집하기

IT위키

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 1번째 줄:
[[분류:데이터베이스]]
[[분류:데이터베이스]][[분류:기술사 기출]]
[[분류:기술사 기출]]
 
;Transaction Concurrency Control
;Transaction Concurrency Control
;여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법
;여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법


==병행제어의 목적==
== 병행제어의 목적 ==
 
* 데이터베이스 일관성 유지
*데이터베이스 일관성 유지
* 일관성을 유지하면서,
*일관성을 유지하면서,
** 데이터베이스 공유 최대화
**데이터베이스 공유 최대화
** 시스템 활용도 최대화
**시스템 활용도 최대화
** 사용자 응답시간 최소화
**사용자 응답시간 최소화
 
==병행제어 실패 현상==
===Dirty Write===
 
;갱신 분실(Lost Update)라고도 한다(정보처리기사 기준)
 
*같은 데이터에 동시에 두 개 이상의 트랜잭션이 값을 바꾸고자 함


== 병행제어 실패 현상 ==
=== Dirty Write ===
; 갱신 분실(Lost Update)라고도 한다(정보처리기사 기준)
* 같은 데이터에 동시에 두 개 이상의 트랜잭션이 값을 바꾸고자 함
{| class="wikitable"
{| class="wikitable"
|-
|-
!T1!!T2
! T1 !! T2
|-
|-
|SELECT age FROM user WHERE id = 1;||
| SELECT age FROM user WHERE id = 1; ||  
|-
|-
| ||SELECT age FROM user WHERE id = 1;
| || SELECT age FROM user WHERE id = 1;
|-
|-
|UPDATE user SET age = 20 WHERE id = 1;
| UPDATE user SET age = 20 WHERE id = 1;
COMMIT ;
COMMIT ;
||
||
|-
|-
| ||UPDATE user SET age = 30 WHERE id = 1;
| || UPDATE user SET age = 30 WHERE id = 1;
COMMIT;
COMMIT;
|}
|}
===Dirty Read===
=== Dirty Read ===
 
; 비완료 의존성(Uncommitted Dependency)라고도 한다(정보처리기사 기준)
;비완료 의존성(Uncommitted Dependency)라고도 한다(정보처리기사 기준)
* 아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함
 
*아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함
 
{| class="wikitable"
{| class="wikitable"
|-
|-
!T1!!T2
! T1 !! T2
|-
|-
|UPDATE user SET age = 20 WHERE id = 1;||
| UPDATE user SET age = 20 WHERE id = 1; ||
|-
|-
| ||SELECT age FROM user WHERE id = 1;
| || SELECT age FROM user WHERE id = 1;
|-
|-
|ROLLBACK;||
| ROLLBACK; ||  
|}
|}


===Non-repeatable Read===
=== Non-repeatable Read ===
 
; 모순성(Inconsistency)이라고도 한다(정보처리기사 기준)
;모순성(Inconsistency)이라고도 한다(정보처리기사 기준)
동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨
 
* 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨
 
[[파일:Non-Repeatable Read.png|border]]
[[파일:Non-Repeatable Read.png|border]]


===Phantom Read===
=== Phantom Read ===
 
* 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨
*동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨
 
[[파일:Phantom Read.png]]
[[파일:Phantom Read.png]]


===Cascade Rollback===
=== Cascade Rollback ===
 
;연쇄 복귀
;연쇄 복귀
* 두개 이상의 Transaction이 수행되던중 한개의 Transaction이 취소될 때 나머지 다른 Transaction도 연쇄적으로 취소되는 현상
* 회복 불가(Unrecoverable): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상


*두개 이상의 Transaction이 수행되던중 한개의 Transaction이 취소될 때 나머지 다른 Transaction도 연쇄적으로 취소되는 현상
== 트랜잭션 고립화 수준 ==
*회복 불가(Unrecoverable): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상
;Transaction Isolation Level(ANSI/ISO SQL92)
 
* 동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
==[[트랜잭션 고립화 수준]]==
 
;동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
 
{| class="wikitable"
{| class="wikitable"
!구분
!Dirty Read
!Non-Repeatable Read
!Phantom Read
|-
|-
|Level0
! 단계 !! 명명 !! 설명
|O
|O
|O
|-
|-
|Level1
| 레벨0
|X
(Level0)
|O
|| Read Uncommitted
|O
||
* 트랜잭션 처리 중인 데이터를 읽을 수 있음
* [발생 가능 현상]
** Dirty Read
** Non-Repeatable Read
** Phantom Read
|-
|-
|Level2
| 레벨1
|X
(Level1)
|X
|| Read Committed
|O
||
* 트랜잭션이 커밋되어 확정된 데이터만 읽을 수 있음
* (대부분의 DBMS에서 기본으로 채택하는 레벨)
* [발생 가능 현상]
** Non-Repeatable Read
** Phantom Read
|-
|-
|Level3
| 레벨2
|X
(Level2)
|X
|| Repeatable Read
|X
||
* 선행 트랜잭션이 데이터를 읽는 경우 종료 전까진 갱신/삭제 불가
* [발생 가능 현상]
** Phantom Read
|-
| 레벨3
(Level3)
|| Serializable
||
* 선행 트랜잭션이 데이터를 읽는 경우 종료 전까진 갱신/삭제/삽입 불가
* 완벽한 정합성을 보장하는 레벨
|}
|}


*표준 고립화 모델에서 갱신 분실과 연쇄 복귀는 다루지 않는다.
* 표준 고립화 모델에서 갱신 분실과 연쇄 복귀는 다루지 않는다.
**갱신 분실은 정상적인 DBMS라면 당연히 Level과 무관하게 당연히 통제 되어야 한다.
** 갱신 분실은 정상적인 DBMS라면 당연히 Level과 무관하게 당연히 통제 되어야 한다.
**연쇄 복귀는 고립화를 통해 갱신 분실이 일어나지 않으면 일어나지 않는다.
** 연쇄 복귀는 고립화를 통해 갱신 분실이 일어나지 않으면 일어나지 않는다.
 
==병행제어 기법==
 
*'''[[데이터베이스 로킹|로킹(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)]]'''
**여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
**충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성
 
==같이 보기==
 
*[[데이터베이스]]
*[[트랜잭션]]
*[[데이터베이스 회복]]


== 참고 문헌 ==
== 병행제어 기법 ==
* [https://peim.tistory.com/4 데이터베이스 병행제어 실패 현상의 표준 표현(블로그)]
* '''[[트랜잭션 로킹|로킹(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)]]'''
** 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
** 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성
IT위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 IT위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소 편집 도움말 (새 창에서 열림)