데이터베이스 병행제어: Difference between revisions

From CS Wiki
No edit summary
No edit summary
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 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)라고도 한다(정보처리기사 기준)
 
* 아직 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;
| ||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도 연쇄적으로 취소되는 현상
;Transaction Isolation Level(ANSI/ISO SQL92)
*회복 불가(Unrecoverable): 연쇄복귀 되어야 하는 트랜잭션들 중 하나가 종료되어 회복이 불가능해 지는 현상
* 동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
 
==[[트랜잭션 고립화 수준]]==
 
;동시 접근에 대해 이상현상이 생기지 않음을 보장하는 트랜잭션 고립화 수준에 관한 표준
 
{| class="wikitable"
{| class="wikitable"
!구분
!Dirty Read
!Non-Repeatable Read
!Phantom Read
|-
|-
! 단계 !! 명명 !! 설명
|Level0
|O
|O
|O
|-
|-
| 레벨0
|Level1
(Level0)
|X
|| Read Uncommitted
|O
||
|O
* 트랜잭션 처리 중인 데이터를 읽을 수 있음
* [발생 가능 현상]
** Dirty Read
** Non-Repeatable Read
** Phantom Read
|-
|-
| 레벨1
|Level2
(Level1)
|X
|| Read Committed
|X
||
|O
* 트랜잭션이 커밋되어 확정된 데이터만 읽을 수 있음
* (대부분의 DBMS에서 기본으로 채택하는 레벨)
* [발생 가능 현상]
** Non-Repeatable Read
** Phantom Read
|-
|-
| 레벨2
|Level3
(Level2)
|X
|| Repeatable Read
|X
||
|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)]]'''
**여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
**충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성
 
==같이 보기==
 
*[[데이터베이스]]
*[[트랜잭션]]
*[[데이터베이스 회복]]


== 병행제어 기법 ==
== 참고 문헌 ==
* '''[[데이터베이스 로킹|로킹(Locking)]]'''
* [https://peim.tistory.com/4 데이터베이스 병행제어 실패 현상의 표준 표현(블로그)]
** 트랜잭션이 어떤 데이터에 접근하고자 할 때 로킹 수행
** 로킹이 되어 있는 데이터에는 다른 트랜잭션이 접근할 수 없음
** 트랜잭션은 로킹이 된 데이터에 대해서만 연산 수행
** 로킹 단위: 필드, 레코드, 파일, 데이터베이스 모두 로킹 단위가 될 수 있음
** '''로킹 단위가 크면'''
*** 관리하기 용이(로킹 오버헤드 감소)하지만 병행성 수준(동시성 수준) 낮아짐
** '''로킹 단위가 작으면'''
*** 병행성(동시성 수준)이 높아지지만 관리가 까다로움(로킹 오버헤드 증가)
* '''[[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)]]'''
** 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
** 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성

Latest revision as of 20:56, 25 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)이라고도 한다(정보처리기사 기준)
  • 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 수정 또는 삭제가 반영되어 값이 변경됨

Non-Repeatable Read.png

Phantom Read[edit | edit source]

  • 동일 트랜잭션에서 동일한 대상을 여러번 읽을 때 그 사이에 새로운 값(Phantom Tuple)이 삽입되어 값이 변경됨

Phantom Read.png

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)
    • 여러 버전의 타임스탬프를 비교하여 스케줄상 직렬가능성이 보장되는 타임스탬프를 선택
    • 충돌이 발생할 경우 복귀 수행. 연쇄 복귀 발생 가능성

같이 보기[edit | edit source]

참고 문헌[edit | edit source]