티스토리 뷰

안녕하세요 강정호입니다. 오늘은 트랜잭션에 대해서 공부해 보겠습니다.


트랜잭션이란?


트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다.



트랜잭션의 특징


1. 트랜잭션은 데이터베이스 시스템에서 병행제어 및 회복 작업 시 처리되는 논리적 단위이다.

2. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업단위이다.

3. 하나의 트랜잭션은 Commit되거나 Rollback 된다.




병행처리의 문제점


다수의 사용자가 데이터베이스에 요청을 보내게 되면 이러한 요청들을 처리할 방법이 필요하다. 만약 하나의 요청을 끝내고 다른 요청을 수행하는 방식이라면 처리시간이 매우 오래 걸린다. 그래서 "병행 처리" 방식으로 처리를 한다.


트랜잭션을 병행처리하면 처리 효율이 높아지지만, 처리 과정에서 동일한 자료를 동시에 접근해서 오류가 생길 수 있다.


 종류

내역 

문제점 

 갱신 유실 문제

두 트랜잭션이 동시에 동일한 자료를 update 

첫째 갱신이 유실 

 오류 읽기 문제갱신하는 도중에 다른 트랜잭션이 read 

낡은 자료 읽기 

 잘못된 요약 

두 자료를 갱신하는 도중에 읽기 

요약 결과 오류 

 무결성 제약조건

두 자료의 제약조건을 검사하지 않고 갱신 일관성 위반 




트랜잭션의 상태


1. Active state : 현재 트랜잭션이 진행 중인 상태

2. Partially committed state : 부분만 커밋된 상태

3. Committed state : 트랜잭션이 커밋된 상태

4. Failed state : 실패한 상태

5. Terminated state : 종료된 상태





트랜잭션의 4가지 특징


1. 원자성(Atomicity) : 트랜잭션이 중간까지만 실행되는 것은 없다. 하나도 안되거나 전부 실행이 되거나 둘 중 하나이다.


2. 일관성 : 데이터베이스의 상태가 일관되어야 한다. ex) 계좌잔고가 항상 0보다 커야하는 경우


3. 고립성 : 한 트랜잭션이 실행되다가 다른 트랜잭션이 끼어들 수 없다.


4. 지속성 : 완료된 트랜잭션은 절대 변하지 않는다.



병행제어가 필요한 이유


1. The Lost Update Problem : 두 개의 트랜잭션이 동일한 아이템에 접근하여 서로의 연산이 중첩될 때 결과적으로 올바르지 않은 값이 저장될 수 있다.


2. The Temporary Update (or Dirty Read) Problem : 한 트랜잭션이 값을 업데이트를 하다가 중간에 트랜잭션이 fail 하였다. 하지만 rollback 하기 이전에 다른 트랜잭션이 값을 읽게 되면 올바르지 않은 값을 읽는 것이다.


3. The Incorrect Summary Problem : 한 트랜잭션이 aggregate 함수(Sum, Max, Min 같은 함수)를 실행하고 있는데, 다른 트랜잭션이 이 값들 중 하나를 업데이트 하고 있을 때. aggregate 트랜잭션이 값이 업데이트 되기 이전을 사용할 때.




Concurrent execution is uncontrolled : The Lost Update Problem


T2에서 write_item(x)을 하면서 T1에서의 write_item(x) 값이 덮어씌워진다.



Concurrent execution is uncontrolled : The Temporary Update Problem



T1이 write_item(X) 함수를 잘못 실행해서 Roll back을 해야 한다. 하지만 Roll back이 되기 이전에 T2의 read_item(X)가 실행되면서 잘못된 값을 읽어들이게 된다.



Concurrent execution is uncontrolled : The incorrect summary problem 


T3의 read_item(Y)가 N이 더해지기 전에 호출이 되었다. 그렇기 때문에 최신 Y값을 찾을 수 없다.





트랜잭션 시스템에 대해서


1. begin_transaction : 이 마크는 트랜잭션 실행이 시작된다는 표시이다.

2. read or write : 데이터베이스에서 값을 읽어오거나 쓰는 연산을 뜻한다

3. end_transaction : 트랜잭션이 끝났음을 마킹하는 표시

4. commit_transaction : 트랜잭션이 성공적으로 끝났음을 알리고 데이터베이스에 커밋을 하여 더 이상 변경될 수 없음을 뜻한다.

5. rollback : 트랜잭션이 성공적으로 끝나지 않았고,  다시 원상복구를 해야 한다는 뜻





트랜잭션 스케쥴링의 종류


1. Serial schedule (직렬스케쥴): 순서대로&하나씩 트랜잭션 실행!!!

트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식으로 하나씩 차례대로 실행하는 스케쥴로서 트랜잭션이 실행되는 동안 다른 트랜잭션의 영향을 받을 수 없으므로 모순이 발생하지 않는다.



2. Serializable schedule (직렬화 스케쥴) : 병행제어&직렬스케쥴 장점 가짐

트랜잭션들이 동시에 자료 접근 연산들을 교차하며 실행시키면서도 결과가 직렬 스케쥴과 동일한 스케쥴이다. 즉, 병행처리하지만 적절한 제어조치를 취함으로써 일관성을 유지하는 스케쥴로서 병행제어에서 필요한 스케쥴이다. 즉, 병행제어 스케쥴은 직렬성을 유지할 수 있다. 직렬성이란 트랜잭션들의 처리 결과가 직렬처리와 동일한 효과를 가지는 스케쥴 특성이다.




직렬화가 되는 것은 직렬과는 다르다. 직렬화는 다음의 의미를 내포하고 있다.

1) 데이터베이스의 일관적인 상태를 유지시킨다.

2) 여러 트랜잭션이 섞여서 진행되며 트랜잭션이 순차적으로 실행된 것처럼 상태를 유지하여 결과적으로 병행처리의 효율성을 달성하는 것. 



Constructing the Precedence Graphs 그래프 순서도





데이터베이스 병행처리 제어 목적


1. 트랜잭션의 충돌을 방지하기 위해서 고립성을 강제하기 위함.


2. 데이터베이스의 일관성을 보존하기 위해서


3. read-write 또는 write-write 충돌을 막기 위해서


스케줄의 진정한 목적은 충돌 스케줄을 찾아서 직렬화 스케줄을 만드는 것이다.



록킹 기법


록의 종류

: 트랜잭션이 자료를 배타적으로 접근할 수 있으면 그 트랜잭션이 완료된 후에 다른 트랜잭션이 실행되기 때문에 직렬성이 확보된다. 자료를 배타적으로 접근하는 방법이 바로 록(lock) 기법이다.


트랜잭션의 ACID 특성을 해치는 접근 연산은 주로 갱신이다. 읽기 연산은 자료 값을 바꾸지 않는다. 하지만 읽기 연산 도중에 갱신을 하게되면 일관성 유지가 어려울 수 있다.


트랜잭션에는 공유 록과 배타 록 2가지가 있다


1. 공유 록(Shared Lock)

- 특정 자료 Q에 공유 록을 걸면 다른 트랜잭션이 이 자료를 갱신할 수 없다.

- 공유 록이 걸린 Q는 다른 트랜잭션에 의해서 읽혀질 수 있다.


2. 배타 록(Exclusive Lock)

- 트랜잭션이 자료를 기록할 때 배타 록 X를 걸어야 한다.

- 록X를 가진 트랜잭션은 자료를 읽을 수도 있고, 갱신할 수도 있다.

- 배타 록 X가 걸린 자료는 공유 록S를 가진 트랜잭션들에 의해서 읽혀질 수 없다.

--> Dirty Read를 방지하기 위해서



Deadlock detection and resolution


교착상태 탐지 및 해결기법

특징 : 일단 교착상태 생각하지 않고 트랜잭션을 실행한다.

교착상태발견 시 : 교착상태에 걸려있는 트랜잭션 중의 하나를 취소하여 교착상태 해결.


이때 사용하는 그래프가 wait-for graph 대기 그래프.



데드락 해결의 부작용

- Starvation : 특정 트랜잭션은 계속해서 기다려야 하는 문제점


Database Recovery - Data update


1. Immediate update

2. Deffered update

3. Shadow update

4. In-place update : 디스크 블록 바로 그 자리에 고대로 덮어쓴다. --> 이게 가장 많이 쓰인다.















































































댓글