<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sql</id>
	<title>IT 위키 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://devhrxoobm.itwiki.kr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sql"/>
	<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Sql"/>
	<updated>2026-09-18T03:11:29Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://devhrxoobm.itwiki.kr/index.php?title=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%B3%91%ED%96%89%EC%A0%9C%EC%96%B4&amp;diff=14060</id>
		<title>데이터베이스 병행제어</title>
		<link rel="alternate" type="text/html" href="https://devhrxoobm.itwiki.kr/index.php?title=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EB%B3%91%ED%96%89%EC%A0%9C%EC%96%B4&amp;diff=14060"/>
		<updated>2020-06-15T12:28:00Z</updated>

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