14. 트랜잭션처리 -...

48
14. 트랜잭션 처리

Upload: others

Post on 07-Sep-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

14. 트랜잭션 처리

인터넷과 Java 중심으로데이타베이스시스템이론과응용

이 장의 주요 내용

트랜잭션 개요

트랜잭션의 특성 (ACID) 원자성(Atomicity)

일관성(Consistency)

격리성(Isolation)

영속성(Durability)

트랜잭션 스케쥴 회복 가능 트랜잭션 스케쥴

직렬 가능 트랜잭션 스케쥴

직렬 가능 스케쥴을 보장하는 2PL

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션(transaction)이란?

한번에 모두 수행되거나 수행되지 않아야 하는 작업 수행의 논리적인 단위 예) 은행 데이타베이스를 기반으로 A계좌에서 B계좌로 10만원

이체하는 경우

원자 트랜잭션(atomic transaction)이라고도 함

선언의 단위 응용 설계자가 데이타베이스 연산들을 한데 모아 한 트랜잭션으

로 선언할 수 있음

명시 방법

Begin transaction과 end transaction 문으로 선언

하나의 응용 프로그램은 여러 개의 트랜잭션을 포함할 수 있음

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션이 가져야 할 특성

1. 원자성 (Atomicity) 트랜잭션 변경 연산은 모두 성공적으로 수행되거나 전혀 수행되

지 않아야 함

2. 일관성 (Consistency) 각 트랜잭션은 트랜잭션 실행 후에 데이타베이스를 하나의 일관

된 상태로 남겨 두어야 함

3. 격리성 (Isolation) 각각의 트랜잭션은 단독으로 실행된 것 같은 효과를 가짐

4. 영속성 (Durability) 트랜잭션이 성공적으로 완료되면 데이타베이스에 대한 변경은

영구적이어야 함 (15장에서 설명)

트랜잭션의 ACID 특성이라고 함

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션의 동작

한 트랜잭션의 수행은 데이타베이스 내의 객체를 접근하기 위한 일련이 요청들을 필요 읽기(read) 연산

쓰기(write) 연산

완료(commit) 연산

트랜잭션에 의해 수행된 갱신들을 데이타베이스에 영구적으로 반영

복귀(rollback) 연산

트랜잭션에서 SQL문들에 의해 수행된 모든 갱신을 취소함

따라서 데이타베이스 상태는 트랜잭션의 첫 구문이 실행되기 전의상태로 돌아가게 됨

트랜잭션 관리자 트랜잭션의 행동을 감시하고 각 동작의 실행이 가능한지를 결정

하는 소프트웨어

다양한 트랜잭션 프로토콜을 수행할 책임을 가짐

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션 동작 예제

SQL 문장

SQL 문의 동작

select balance from Customer where accountId=101

update Customer set balance = 0 where accountId = 101

동작식별자 동작의결과

AaccountId = 101를만족하는 Customer 객체의 balance

애트리뷰트읽어오기(read)

BaccountId = 101를만족하는 Customer 객체의 balance

애트리뷰트에쓰기(write)

인터넷과 Java 중심으로데이타베이스시스템이론과응용

단일 트랜잭션 시스템에서 트랜잭션의 원자성

단일 트랜잭션 시스템이란? 한번에 오직 하나의 트랜잭션만이 실행

이전 트랜잭션이 종료될 때까지 새로운 트랜잭션을 시작할 수없음

원자성을 지원하기 위한 연산 완료 (commit)

복귀 (rollback)

인터넷과 Java 중심으로데이타베이스시스템이론과응용

SQL 데이타베이스에 대한 트랜잭션 모드

자동 완료 모드(autocommit mode) 하나의 SQL 문장은 하나의 트랜잭션으로 수행

트랜잭션을 오픈하기 위한 묵시적인 요청으로 시작

자동적으로 완료 요청

SQL 문장의 실행이 실패 했을 경우 복귀

명시적 완료 모드(explicit commit mode) 여러 SQL 문장들을 단일 트랜잭션으로 실행

새로운 트랜잭션을 생성할 수 있도록 오픈 트랜잭션 문 실행

트랜잭션을 완료할 수 있도록 완료 트랜잭션 문 실행

응용이 트랜잭션의 취소를 요청하면 복귀 문장 실행

인터넷과 Java 중심으로데이타베이스시스템이론과응용

의사코드로 표현된 트랜잭션 예open transaction

/* “Star Wars” 영화의복사본을찾음 */

int video1 = select id of an available copy of "Star Wars“/* 찾은복사본을예약하기위해예약테이블에삽입, 만약복사본이없다면전체예약취소 */

if (video1 == null) rollback transaction

insert row into Reservation for video1

/* “Return of the Jedi” 영화의복사본을찾음 */

int video2 = select id of an available copy of "Return of the Jedi“/* 찾은복사본을예약하기위해예약테이블에삽입, 만약복사본이없다면전체예약취소 */

if (video2 == null) rollback transaction

insert row into Reservation for video2

/* “The Empire Strikes Back” 영화의복사본을찾음 */

int video3 = select id of an available copy of "The Empire Strikes Back“/* 찾은복사본을예약하기위해예약테이블에삽입, 만약복사본이없다면전체예약취소 */

if (video3 == null) rollback transaction

insert row into Reservation for video3

commit transaction

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션의 원자성 지원 트랜잭션 복귀

시스템이 트랜잭션에 의해 변경된 내역을 유지

변경 내역이나 이전의 상태를 임시 영역에 저장

Orcle8에서의 복귀 : immediate update 오픈된 각각의 트랜잭션에 대하여 롤백 세그먼트(RBS : rollback

segment) 엔트리를 포함하는 데이타 영역 포함

RBS 엔트리

트랜잭션으로 변경된 행들에 대한 이미지 집합

이미지 : 트랜잭션이 실행되기 이전의 값

트랜잭션 연산

오픈 : 새로운 RBS 엔트리 생성하고 트랜잭션과 연관시킴

완료 : RBS 엔트리를 삭제하고 변경 내용을 데이타베이스에 영구적으로 반영

복귀 : 변경된 모든 행들을 RBS엔트리로부터 가져와 복구

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션의 원자성 지원 [계속]

Oracle 8에서 트랜잭션 처리시 데이타베이스 상태

트랜잭션 T

T.A 쓰기 r

T.B 쓰기 s

T.C 읽기 s

T.D 읽기 u

Oracle8 데이타베이스서버

롤백세그먼트이전이미지

rs

데이타베이스테이블갱신된값

rstu

인터넷과 Java 중심으로데이타베이스시스템이론과응용

단일 트랜잭션 시스템에서 트랜잭션의 원자성

트랜잭션 복귀를 위해서는 시스템이 트랜잭션에 의해 변경된 내역을 유지 변경 내역이나 이전의 상태를 임시 영역에 저장

savepoint 연산 SQL 에서 지원

트랜잭션 내에 중간 복귀 시점 만듦

savepoint가 실행 되었을 당시의 상태로 복구하기 위해 사용

savepoint가 실행된 이후에 발생된 모든 갱신들만이 취소

SQL 문 예

savepoint A;

rollback to A;

인터넷과 Java 중심으로데이타베이스시스템이론과응용

일관성 보장

데이터 모델의 모든 제약 조건을 만족한다면 데이타베이스는 일관성 상태로 됨 제약조건 : 기본 키와 외래 키 제약 조건, 도메인 제약 조건, 비즈

니스 규칙 등

트랜잭션 모델 하에서 각 트랜잭션은 데이타베이스가 트랜잭션 실행 전에 일관된 상태였다면 적절한 완료 작업이후에도 일관된 상태로 유지할 수 있도록 설계되어야 함

인터넷과 Java 중심으로데이타베이스시스템이론과응용

일관성 보장의 예

예) 영화의 movieId를 변경 가정

Movie 테이블에 한 영화가 이미 추가되어 있고 Videotape 테이블에 복사본이 있음

movieId를 변경하기 위해 Movie 테이블과 Videotape 테이블을 모두 변경할 경우

Update Movie set movieId = 101045 where movieId = 101023

Update Videotape set movieId = 101045 where movieId = 101023→무결성 제약조건 위배

인터넷과 Java 중심으로데이타베이스시스템이론과응용

movieId 변경을 위한 해결 방법들 – 1/3

해결 방법 1

insert into Movie (movieId, title, genre, length, rating)

select 101045, title, genre, length, rating from Movie

where movieId=101023

update Videotape set movieId=101045 where movieId=101023

delete from Movie where movieId=101023

인터넷과 Java 중심으로데이타베이스시스템이론과응용

movieId 변경을 위한 해결 방법들 – 2/3

해결 방법 2 : Trigger 기능 이용 Trigger : 어떤 이벤트와 조건이 발생하였을 때, 데이타베이스 시

스템이 수행할 자동적인 동작을 명시하는데 사용

create trigger movieId_check

after update of movieId on (Movie)

referencing old row as orow

referencing new row as nrow

for each row

when

select V.movieId

from Videotape V

where V.movieId= orow.movieId

begin

update videotape

set movieId=nrow.movieId

where videotape.movieId=orow.movieId;

end;

• 이벤트 : - insert, delete, update 연산- before나 after 키워드다음에명시

• 조건 :- 조건이참이될때동작을실행- when 절로명시

• 실행동작 :- 조건을만족할때

인터넷과 Java 중심으로데이타베이스시스템이론과응용

movieId 변경을 위한 해결 방법들 – 3/3

해결 방법3 : 스키마의 on delete, on update 이용

create table videotape {

videoId int;

movieId int;

….

foreign key movieId references Movie

on delete cascade on update cascade }

인터넷과 Java 중심으로데이타베이스시스템이론과응용

병행 트랜잭션 처리

대부분 DBMS는 다수 사용자 시스템

데이타베이스에서 동시성 제어에 관한 대부분의 이론은병행 처리 형태(A) 의 동시성 관점에서 개발 예) 동시에 수행되는 트랜잭션을 처리하는 방법들

병렬처리(B)병행처리(A)

인터넷과 Java 중심으로데이타베이스시스템이론과응용

병행 트랜잭션 처리

별개의 응용들이 병행적으로 데이타베이스 서버에 서비스를 요청함으로 트랜잭션 연산의 중첩이 발생

트랜잭션의 격리성 원리1. 아직 완료되지 않은 응용에 의해 가해진 변경은 다른 트랜잭션

에게 보이지 않아야 한다.

2. 다른 트랜잭션에 의해 가해진 변경들을 (완료된 트랜잭션 조차도) 응용에서 알아 볼 수 있도록 해서는 안 된다.

실행중인 트랜잭션은 다른 트랜잭션의 간섭 없이 그 실행을 완료 할 수 있어야 함

인터넷과 Java 중심으로데이타베이스시스템이론과응용

간섭의 예

간섭 1

트랜잭션 T2에 의한 쓰기 연산이 트랜잭션 T1을 간섭함

예) 시간 1과 시간 3에서 같은 객체 r에 대해 서로 다른 값을 읽음

간섭 2

트랜잭션 T1에 의해 가해진 변경이 그 이후에 취소되었음에도트랜잭션 T2에 의해 부적절하게 읽혀짐

예) 시간 4에서 T1은 객체 u를 쓰고, 시간 5에서 T2는 그 값을 읽음

실행 스케쥴 : T1.A, T2.A, T1.B, T1.c, T2.B, T1.D

데이타베이스 서버

데이타베이스테이블

r

s

t

u

T2가

T1을

간섭

T1이

T2를

간섭

트랜잭션 T2

쓰기 rT2.A

동작

읽기 uT2.B

3

2

1

시간

4

5

6

트랜잭션 T1

읽기 rT1.B

읽기 rT1.A

동작

쓰기 uT1.C

복귀T1.D

3

2

1

시간

4

5

6

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 1/6

갱신 분실(lost update) 문제를 나타내는 스케줄 S1

S1: T3.A, T4.A, T3.B, T4.B, T3.commit, T4.commit

트랜잭션 T4의동작트랜잭션 T3의동작

T4.A balance2 = (select balance from

Customer where accountId = 101);

balance2 += 10.00;

T4.B update Customer set balance =

?balance2 where accountId = 101;

T3.A balance1 = (select balance from

Customer where accountId = 101);

balance1 += 5.00;

T3.B update Customer set balance =

?balance1 where accountId = 101;

시간 트랜잭션 T3 연산 트랜잭션 T4

1 T3.A 계정 101의잔액읽어오기 : $15

2 계정 101의잔액읽어오기 : $15 T4.A

3 T3.B 계정 101의잔액에쓰기 : $20

4 계정 101의잔액에쓰기 : $25 T4.B

5 T3.commit

6 T4.commit

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 2/6

오손 판독(dirty read) 문제를 나타내는 스케줄 S2

S2: T3.A, T3.B, T4.A, T3.rollback, T4.B, T4.commit

오손된 값 : 데이타베이스에 저장되지 않은 값

시간 트랜잭션 T3 연산 트랜잭션 T4

1 T3.A 계정 101의잔액읽어오기 : $15

2 T3.B 계정 101의잔액쓰기 : $20

3 계정 101의잔액읽어오기 : $20 T4.A

4 T3.rollback 계정 101의잔액복원: $15

5 계정 101의잔액쓰기 : $30 T4.B

6 T4.commit

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 3/6

T5 : 102 계좌 잔액에서 101고객의 계정으로 $10이체

T6 : 두 101과 102고객의 총 잔액을 계산

트랜잭션 T6의동작트랜잭션 T5의동작

T6.A total = select sum(balance) from

Customer where accountId = 101

or accountId = 102;

T5.A balance1 = (select balance from

Customer where accountId = 101);

balance1 += 10.00;

T5.B update Customer set balance =

?balance1 where accountId = 101;

T5.C balance1 = (select balance from

Customer where accountId = 102);

balance1 -= 10.00;

T5.D update Customer set balance =

?balance1 where accountId = 102;

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 4/6

부정확한 요약(incorrect summary) 문제를 나타내는 스케줄 S3

S3: T5.A, T5.B, T6.A, T6.commit, T5.C, T5.D, T5.commit

시간 트랜잭션 T3 연산 트랜잭션 T4

1 T5.A 계정 101의잔액읽어오기 : $15

2 T5.B 계정 101의잔액에쓰기 : $25

3 계정 101의잔액읽어오기 : $25T6.A

계정 102의잔액읽어오기 : $15

4 T6.commit

5 T5.C 계정 102의잔액읽어오기 : $15

6 T5.D 계정 102의잔액에쓰기 : $5

7 T5.commit

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 5/6

반복 불가능(unrepeatable read)한 읽기 문제를 나타내는 스케줄 S4

S4: T7.A, T8.A, T8.commit, T7.B, T7.commit

트랜잭션 T8의동작트랜잭션 T7의동작

T8.A update Customer set balance = 0.0

where accountId = 101;

T7.A balance1 = (select balance from

Customer where accountId = 101);

T7.B balance2 = (select balance from

Customer where accountId = 101);

시간 트랜잭션 T7 연산 트랜잭션 T8

1 T7.A 계정 101의잔액읽어오기 : $15

2 계정 101의잔액에쓰기 : $0 T8.A

3 T8.commit

4 T7.B 계정 101의잔액읽어오기 : $0

5 T7.commit

인터넷과 Java 중심으로데이타베이스시스템이론과응용

격리되지 않은 트랜잭션의 문제점 - 6/6

팬텀 문제를 나타내는 스케줄 S5

S5: T9.A, T10.A, T9.B, T10.rollback, T9.commit

시간 트랜잭션 T9 연산 트랜잭션 T10

1 T9.A 계정의잔액합계읽어오기 : $100

2 잔액이있는새계정 105의삽입 : $10 T10.A

3 T9.B 계정의잔액합계읽어오기 : $110

4 계정 105의제거 T10.rollback

5 T9.commit

트랜잭션 T10의동작트랜잭션 T9의동작

T10.A insert into Customer (accountId,

balance, zipcode) values

(105, 10.00, 31101)

T9.A totalA = select sum(balance) from

Customer where zipcode = 31101

T9.B totalB = select sum(balance) from

Customer where zipcode = 31101

인터넷과 Java 중심으로데이타베이스시스템이론과응용

회복가능 트랜잭션 스케줄 - 1/2

트랜잭션 스케쥴이란? 트랜잭션들이 인터리브된 방식으로 병행 실행될 때, 여러 트랜잭

션들이 가진 연산들의 실행 순서

스케쥴 S에 참여하는 각 트랜잭션 Ti에 대해서 Ti의 연산들이 Ti

내에서와 동일한 순서로 스케쥴 S에 나타나야 함

동시 실행을 보장하기 위해서는 스케쥴의 형태에 어떤 제한을 둘 필요가 있음

회복 가능한 스케쥴 (recoverable schedule) 스케쥴 S안에 있는 어떤 트랜잭션 T가 읽은 값에 쓰기 연산을 수

행한 또 다른 트랜잭션 T’이 완료되기 전까지 트랜잭션 T가 완료되지 않는 스케줄

인터넷과 Java 중심으로데이타베이스시스템이론과응용

회복불가능 트랜잭션 스케줄 예

스케줄 S7은 회복 불가능 스케줄 S7: T3.A, T3.B, T4.A, T4.B, T4.commit, T3.rollback

시간 트랜잭션 T3 연산 트랜잭션 T4

1 T3.A 계정 101의잔액읽어오기 : $15

2 T3.B 계정 101의잔액에쓰기 : $20

3 계정 101의잔액읽어오기 : $20 T4.A

4 계정 101의잔액에쓰기 : $30 T4.B

5 T4.commit

6 T3.rollback 계정 101의잔액복구 : $15

트랜잭션 T4의동작트랜잭션 T3의동작

T4.A balance2 = (select balance from

Customer where accountId = 101);

balance2 += 10.00;

T4.B update Customer set balance =

?balance2 where accountId = 101;

T3.A balance1 = (select balance from

Customer where accountId = 101);

balance1 += 5.00;

T3.B update Customer set balance =

?balance1 where accountId = 101;

인터넷과 Java 중심으로데이타베이스시스템이론과응용

회복가능 트랜잭션 스케줄 - 2/2

연쇄 복귀 (cascading rollback) 문제 연쇄 : S2에서 트랜잭션 T3의 복귀가 다시 또 다른 트랜잭션의

복귀 원인이 되는 상태

여러 트랜잭션이 복귀될 수 있기 때문에 연쇄 복귀는 많은 시간을 소비

이런 현상이 나타나지 않는 것을 보장하는 스케쥴들을 특성화하는 것이 중요

엄격한 스케줄 (strict schedule) 객체에 쓰기 연산을 수행한 트랜잭션이 완료되기 전까지 어떠한

트랜잭션도 그 객체를 읽거나 쓰지 못하는 것

항상 옳지는 않지만, 효율적 복귀 지원

인터넷과 Java 중심으로데이타베이스시스템이론과응용

엄격한 트랜잭션 스케줄 예

스케줄 S7-1은 엄격한 스케줄 S7-1: T3.A, T3.B, T3.commit, T4.A, T4.B, T4.commit

포함 관계

시간 트랜잭션 T3 연산 트랜잭션 T4

1 T3.A 계정 101의잔액읽어오기 : $15

2 T3.B 계정 101의잔액에쓰기 : $20

3 T3.commit

4 계정 101의잔액읽어오기 : $20 T4.A

5 계정 101의잔액에쓰기 : $30 T4.B

6 T4.commit

회복가능한스케쥴

연쇄복귀방지하는스케쥴

엄격한스케쥴

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 트랜잭션 스케줄 - 1/3

직렬 스케줄 (serial schedule) 서로 다른 트랜잭션 동작들이 인터리브 되지 않고 수행되는 스

케줄

즉, 한 트랜잭션의 모든 동작들은 다음 트랜잭션들의 동작보다 먼저수행

병행성 문제 발생 하지 않으나, 비현실적임

직렬 스케쥴처럼 동작하지만, 병행 실행을 수행하는 스케쥴이 필요

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 트랜잭션 스케줄 - 2/3

직렬가능 스케줄(serializable schedule) 직렬 스케줄과 동치(equivalent)인 병렬 스케줄

예) 충돌 동치(conflict equivalent)

두 스케줄의 충돌 동작 순서가 같은 것

충돌 (conflict) : 두 트랜잭션이 모두 어떤 데이타 객체를 참조하고 있고그 중 한 트랜잭션이 그 객체를 갱신할 때

스케쥴 1 (직렬가능스케쥴) 스케쥴 2 (직렬스케쥴)

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 스케쥴이 필요한 예

BigHit 비디오에 대한 PayStatement 생성 트랜잭션

/* TimeCard 테이블로부터 PayStatement 테이블에새로운값을삽입하고 TimeCard 테이블의paid를 true로표시 */

1. begin transaction;

2. insert into PayStatement

3. (ssn, hourlyRate, numHours, amountPaid, dataPaid)

4. select TimeCard.ssn, hourlyRate,

5. sum((endTime-startTime)*24) as hoursWorked,

6. sum((endTime-startTime)*24*hourlyRate) as amountPaid,

7. today

8. from TimeCard, HourlyEmployee

9. where TimeCard.ssn = HourlyEmployee.ssn and paid = false

10. group by TimeCard.ssn, hourlyRate;

11. update TimeCard set paid = true

12. where paid = false;

13. Commit transaction;

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 트랜잭션 스케줄 - 3/3

트랜잭션 관리의 목표 모든 트랜잭션을 직렬가능 스케줄로 실행

방법 1 : 직렬가능 하지 않은 스케줄 탐지 필요

방법 2 : 직렬가능 스케줄을 보장하는 트랜잭션들을 설계할 프로토콜 요구 (2PL)

방법 1 : 직렬 불가능 스케줄 검사 트랜잭션 관리 시스템이 스케줄에서 발생한 모든 충돌 발견

시스템은 오픈 트랜잭션의 동작에 대해 가능한 모든 직렬 스케줄의 기록을 유지

충돌이 발생할 때

충돌 동치 직렬 스케줄이 존재한다면, 직렬가능 스케줄

그렇지 않은 경우, 트랜잭션 복귀

실행하는데 비용이 많이 듦

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 스케줄을 보장하는 2단계 로킹 – 1/2

방법 2: 2단계 로킹(2PL:two-phase locking) 데이터 항목들을 로킹하는 기법을 사용

여러 트랜잭션이 그 항목들에 동시에 접근하는 것을 방지하기위함

로크 타입 읽기 로크(read lock)

비배타적이며 많은 판독자들 사이에 공유될 수 있음

객체를 읽을 수는 있으나 변경할 수는 없음

공유 로크 (shared lock) 라고도 함

읽기 로크를 차지하고 있는 한 트랜잭션은 다른 트랜잭션이 읽기 로크를 걸지 않은 경우에만 그 로크를 쓰기 로크로 상승 시킬 수 있음

인터넷과 Java 중심으로데이타베이스시스템이론과응용

직렬가능 스케줄을 보장하는 2단계 로킹 - 2/2

쓰기 로크(write lock)

배타적이며 트랜잭션이 객체를 변경할 수 있음

다른 어떠한 트랜잭션도 그 객체로부터 읽어 오거나 그 객체에 쓰기를 할 수 없음

배타 로크(exclusive lock)라고도 함

쓰기 로크는 어느 때라도 읽기 로크로 하강 될 수 있음

로크의 단위(granularity) 개별적으로 로크 될 수 있는 객체의 크기

예) 데이타베이스 레코드, 데이타베이스 레코드의 필드값, 디스크 블록, 파일 전체, 데이타베이스 전체

로크 단위가 작아질수록

병행성 증가, 오버헤드 증가

로크 단위가 커질수록

병행성 감소, 유지 로크 수 감소, 로크를 걸고 해제하는데 걸리는 시간 감소

인터넷과 Java 중심으로데이타베이스시스템이론과응용

2단계 로킹 프로토콜

2단계 로킹(2PL : two-phase locking) 프로토콜이란? 확장 단계(growing phase)

새로운 로크를 요청할 수 있음

공유 로크 -> 배타적 로크로 상승시킬 수 있음

축소 단계(shrinking phase)

로크를 해제

배타적 로크 -> 공유 로크로 하강시킬 수 있음

트랜잭션은 두 단계를 섞어서 사용할 수 없음

어떤 로크가 해제되면 그 트랜잭션은 새로운 로크를 요청 할 수없음.

인터넷과 Java 중심으로데이타베이스시스템이론과응용

2PL을 따르는 트랜잭션과 그렇지 않은 트랜잭션

트랜잭션 T13 : 2단계 로킹을 따르는 트랜잭션

트랜잭션 T14 : 2단계 로킹을 따르지 않는 트랜잭션

데이터 항목 : A, B, C, D, E

시간 트랜잭션 T13의로크동작 단계

T13.A A에대한읽기로크획득 : read_lock(A) 확장단계시작

T13.B B에대한읽기로크획득 : read_lock(B)

T13.C A의로크를쓰기로크로상승 : write_lock(A)

T13.D B에읽기로크해제 : unlock(B) 축소단계시작

T13.E A의로크를읽기로크로하강 : read_lock(A)

T13.F A에읽기로크해제 unlock(A)

시간 트랜잭션 T14의로크동작 단계

T14.A A에대한읽기로크획득 : read_lock(A) 확장단계시작

T14.B B에대한읽기로크획득 : read_lock(B)

T14.C B의읽기로크해제 : unlock(B) 축소단계시작

T14.D A의로크를쓰기로크로상승 : write_lock(B) 위반

T14.E B에대한읽기로크획득 : read_lock(B) 위반

인터넷과 Java 중심으로데이타베이스시스템이론과응용

2PL을 따르는 트랜잭션들 예

시간 T1 T2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

read_lock(Y);

read_item(Y);

write_lock(X);

unlock(Y);

read_item(X);

X:=X+Y;

write_item(X);

unlock(X);

read_lock(X);

read_item(X);

write_lock(Y);

unlock(X);

read_item(Y);

Y=X+Y;

write_item(Y);

unlock(Y);

인터넷과 Java 중심으로데이타베이스시스템이론과응용

보수적 2단계 로킹

보수적 2단계 로킹 (conservative 2PL) 각 트랜잭션이 그 트랜잭션의 시작 초기에서 모든 로크를 얻도

록 하는 것

확장 단계 : 초기에 발생

축소 단계 : 전체 실행 동안

장점

트랜잭션이 충돌이나 교착상태가 전혀 일어나지 않고 실행이 완료될 수 있음

단점

트랜잭션은 사용 가능한 모든 객체에 로크를 걸어야 하므로, 병행성이 제한됨

인터넷과 Java 중심으로데이타베이스시스템이론과응용

엄격한 2단계 로킹

엄격한 2단계 로킹 (strict 2PL) 트랜잭션 끝까지 모든 로크를 유지하고 완료나 복귀 시에 해제

확장 단계 : 전체 실행 동안

장점

각 트랜잭션이 필요로 하는 것에만 로크를 설정

단점

교착상태가 일어날 가능성이 있음

인터넷과 Java 중심으로데이타베이스시스템이론과응용

엄격한 2PL로 실행되는 예 -1/2

1. begin transaction;

2. insert into PayStatement

3. (ssn, hourlyRate, numHours, amountPaid, dataPaid)

4. select TimeCard.ssn, hourlyRate,

5. sum((endTime-startTime)*24) as hoursWorked,

6. sum((endTime-startTime)*24*hourlyRate) as amountPaid,

7. today

8. from TimeCard, HourlyEmployee

9. where TimeCard.ssn = HourlyEmployee.ssn and paid = false

10. group by TimeCard.ssn, hourlyRate;

11. update TimeCard set paid = true

12. where paid = false;

13. Commit transaction;

PayStatement 트랜잭션

인터넷과 Java 중심으로데이타베이스시스템이론과응용

연산 설명

read_lock(TimeCard)

read_lock(HourlyEmployee)

TimeCard와 HourlyEmployee의 전체테이블에읽기로크획득

Select 절실행 select from TimeCard, HourlyEmployee 실행

Write_lock(PayStatement) PayStatement의전체테이블에쓰기로크획득

Insert 절실행 insert into PayStatement 실행

Write_lock(TimeCard) Timecard의로크를쓰기로크로상승

Update절실행 update TimeCard 실행

Unlock(TimeCard)

Unlock(PayStatement)

Unlock(HourlyEmployee)

모드로크해제

엄격한 2PL로 실행되는 예 -2/2

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션 처리에서 교착상태

교착상태(deadlock) 각 트랜잭션이 다른 트랜잭션에 의해 요청되는 있는 로크를 차

지하고 있는 경우

해결방법1. 교착상태에 빠진 트랜잭션 중에 하나를 철회하고 로크를 해제

2. 교착 상태 예방 프로토콜 사용

예) 자원의 우선 순위를 정해 놓고 모든 로크는 정의된 순서 내에서요청되도록 하는 것

SQL에서 시행하기 어려움

인터넷과 Java 중심으로데이타베이스시스템이론과응용

트랜잭션과 교착상태 스케줄 예제

교착상태를 나타내는 스케줄 S6

S6: T11.A, T12.A, T11.B, T12.B

트랜잭션 T12의동작트랜잭션 T11의동작

T12.A update Customer set balance = 10.0

where accountId = 102;

T12.B update Customer set balance = 10.0

where accountId = 101;

T11.A update Customer set balance = 0.0

where accountId = 101;

T11.B update Customer set balance = 0.0

where accountId = 102;

시간 트랜잭션 T11 연산 트랜잭션 T12

1 T11.A 계정 101에대한배타적로크

2 계정 102에대한배타적로크 T12.A

3 T11.B 계정 102에대한배타적로크요청 : 봉쇄

4 계정 101에대한배타적로크요청 : 봉쇄 T12.B

인터넷과 Java 중심으로데이타베이스시스템이론과응용

교착 상태의 예

time T1 T2

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

read_lock(Y);

read_item(Y);

write_lock(X);

unlock(Y);

read_item(X);

X:=X+Y;

write_item(X);

unlock(X);

read_lock(X);

read_item(X);

write_lock(Y);

unlock(X);

read_item(Y);

Y=X+Y;

write_item(Y);

unlock(Y);

wait

wait

T1 T2

X

Y

인터넷과 Java 중심으로데이타베이스시스템이론과응용

SQL에서 묵시적 로킹 - 1/2

SQL에서 트랜잭션의 4가지 격리 레벨(isolation level) 미완료된 트랜잭션 읽기(read uncommitted)

오손판독, 반복불가능 읽기, 팬텀 문제가 발생

완료된 트랜잭션 읽기(read committed)

반복불가능 읽기, 팬텀 문제가 발생

반복가능 읽기(repeatable read)

팬텀 문제가 발생

직렬 가능(serializable)

오손판독, 반복불가능 읽기, 팬텀 문제 모두 예방

인터넷과 Java 중심으로데이타베이스시스템이론과응용

SQL에서 묵시적 로킹 - 2/2

SQL 표준 DBMS가 어떠한 레벨이든 지원할 수 있도록 허용

직렬가능 레벨이 기본 레벨로 제공

시스템이 트랜잭션을 더 높은 레벨로 상승시키는 것도 허용

직렬가능 레벨만을 지원하는 것도 허용

Oracle 8 완료된 트랜잭션 읽기와 직렬가능 레벨 제공

Set transaction 문

격리 레벨을 명시

트랜잭션이 데이타베이스를 갱신할 수 있는지의 여부를 나타냄

set transaction read only;

set transaction read write; /*기본값 */

set transaction isolation read committed; /* Oracle8에서기본값 */

set transaction isolation level serializable; /* SQL에서기본값 */