데이터베이스 병행제어: Difference between revisions
From IT Wiki
No edit summary |
No edit summary |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[분류:데이터베이스]][[분류:기술사 기출]] | [[분류:데이터베이스]] | ||
[[분류:기술사 기출]] | |||
;Transaction Concurrency Control | ;Transaction Concurrency Control | ||
;여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법 | ;여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법 | ||
== 병행제어의 목적 == | ==병행제어의 목적== | ||
* 데이터베이스 일관성 유지 | |||
* 일관성을 유지하면서, | *데이터베이스 일관성 유지 | ||
** 데이터베이스 공유 최대화 | *일관성을 유지하면서, | ||
** 시스템 활용도 최대화 | **데이터베이스 공유 최대화 | ||
** 사용자 응답시간 최소화 | **시스템 활용도 최대화 | ||
**사용자 응답시간 최소화 | |||
==병행제어 실패 현상== | |||
===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; | ||
|- | |- | ||
| 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; | ||
COMMIT; | COMMIT; | ||
|} | |} | ||
=== Dirty Read === | ===Dirty Read=== | ||
; 비완료 의존성(Uncommitted Dependency)라고도 한다(정보처리기사 기준) | |||
* 아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함 | ;비완료 의존성(Uncommitted Dependency)라고도 한다(정보처리기사 기준) | ||
*아직 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; | ||
|- | |- | ||
| 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): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상 | ||
==[[트랜잭션 고립화 수준]]== | |||
;동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준 | |||
{| class="wikitable" | {| class="wikitable" | ||
!구분 | |||
!Dirty Read | |||
!Non-Repeatable Read | |||
!Phantom Read | |||
|- | |- | ||
|Level0 | |||
|O | |||
|O | |||
|O | |||
|- | |- | ||
| | |Level1 | ||
|X | |||
| | |O | ||
| | |O | ||
|- | |- | ||
| | |Level2 | ||
|X | |||
| | |X | ||
| | |O | ||
|- | |- | ||
| | |Level3 | ||
|X | |||
|X | |||
| | |X | ||
| | |||
| | |||
|} | |} | ||
* 표준 고립화 모델에서 갱신 분실과 연쇄 복귀는 다루지 않는다. | *표준 고립화 모델에서 갱신 분실과 연쇄 복귀는 다루지 않는다. | ||
** 갱신 분실은 정상적인 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 데이터베이스 병행제어 실패 현상의 표준 표현(블로그)] | ||
Latest revision as of 10:56, 26 August 2021
- Transaction Concurrency Control
- 여러 트랜잭션들이 동시에 실행되면서도 데이터베이스의 일관성을 유지할 수 있게 하는 기법
병행제어의 목적[edit | edit source]
- 데이터베이스 일관성 유지
- 일관성을 유지하면서,
- 데이터베이스 공유 최대화
- 시스템 활용도 최대화
- 사용자 응답시간 최소화
병행제어 실패 현상[edit | edit source]
Dirty Write[edit | edit source]
- 갱신 분실(Lost Update)라고도 한다(정보처리기사 기준)
- 같은 데이터에 동시에 두 개 이상의 트랜잭션이 값을 바꾸고자 함
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[edit | edit source]
- 비완료 의존성(Uncommitted Dependency)라고도 한다(정보처리기사 기준)
- 아직 commit되지 않은 트랜잭션의 내용을 읽으려고 함
T1 | T2 |
---|---|
UPDATE user SET age = 20 WHERE id = 1; | |
SELECT age FROM user WHERE id = 1; | |
ROLLBACK; |
Non-repeatable Read[edit | edit source]
- 모순성(Inconsistency)이라고도 한다(정보처리기사 기준)
- 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨
Phantom Read[edit | edit source]
- 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨
Cascade Rollback[edit | edit source]
- 연쇄 복귀
- 두개 이상의 Transaction이 수행되던중 한개의 Transaction이 취소될 때 나머지 다른 Transaction도 연쇄적으로 취소되는 현상
- 회복 불가(Unrecoverable): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상
트랜잭션 고립화 수준[edit | edit source]
- 동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
구분 | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
Level0 | O | O | O |
Level1 | X | O | O |
Level2 | X | X | O |
Level3 | X | X | X |
- 표준 고립화 모델에서 갱신 분실과 연쇄 복귀는 다루지 않는다.
- 갱신 분실은 정상적인 DBMS라면 당연히 Level과 무관하게 당연히 통제 되어야 한다.
- 연쇄 복귀는 고립화를 통해 갱신 분실이 일어나지 않으면 일어나지 않는다.
병행제어 기법[edit | edit source]
- 로킹(Locking)
- 트랜잭션이 어떤 데이터에 접근하고자 할 때 로킹 수행
- 로킹이 되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
- 트랜잭션은 로킹이 된 데이터에 대해서만 연산 수행
- 로킹 단위: 필드, 레코드, 파일, 데이터베이스 모두 로킹 단위가 될 수 있음
- 로킹 단위가 크면
- 관리하기 용이(로킹 오버헤드 감소)하지만 병행성 수준(동시성 수준) 낮아짐
- 로킹 단위가 작으면
- 병행성(동시성 수준)이 높아지지만 관리가 까다로움(로킹 오버헤드 증가)
- 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)
- 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
- 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성