컴퓨터(Computer Science)/데이터베이스, DB, DataBase

데이터베이스, 트랜잭션(Transaction) -1 (개념과 정의)

게임이 더 좋아 2020. 12. 14. 14:34
반응형
728x170

데이터베이스 모델도 설계를 다했으니 이제 진짜로 사용하는 단계에 돌입해야 한다.

하지만 그 전에 데이터베이스의 논리적 연산 단위인 트랜잭션에 대해 알 필요가 꼭 있다.

 

우선 응용프로그램에 대해서 살펴보자

 

일반 응용 프로그램의 구성

- 명령어들의 집합(메서드나 클래스 단위로 구성)

 

하지만 데이터베이스들은 다른 방식으로 응용프로그램을 바라봐야 한다.

-> 세부 프로그램이 작업 단위가 된다.

 

데이터베이스 응용 프로그램의 구성

- 업무처리에 관련된 세부 프로그램 단위

- 세부 프로그램들은 데이터베이스에 대한 연산(검색/삽입/삭제/수정)으로 구성

- 예를 들면 은행에서 계좌이체, 대출, 예금, 출금 업무


 

다시 트랜잭션의 본 뜻은

- 논리적인 작업 단위를 구성하는 연산들의 집합

- 실행 중 멈추거나 중단되지 않는 최소 작업 단위 (All or Nothing)

-> 데이터베이스 응용 프로그램은 트랜잭션의 집합

 

-> 결국 트랜잭션이 정의된 모든 연산을 완벽하게 실행하든지 아니면 모두 실행하지 않고 처음의 상태로 남아있는지를 결정하는 중요한 역할을 한다는 것이다(All or Nothing)

트랜잭션이 필요한 이유는 위의 예와 같이 원하지 않는 결과가 발생하지 않도록 사전에 방지하기 위해서이다.

이를 위해 데이터베이스 개발자는 작업단위를 트랜잭션으로 정의하는 것이다.

**트랜잭션을 정의하는 것은 개발자의 의무지만, 트랜잭션으로 문제가 발생하지 못하게 방지하는 것은 DBMS의  임무가 된다.

다행히 대부분의 DBMS들은 이러한 상황을 방지하기 위한 기능을 갖췄다.

 


이제 왜 필요한지 알았으니 트랜잭션을 어떻게 만들어야 하는가가 궁금해야 정상이다.

 

어떻게 만들까?

 

트랜잭션은 지켜야 할 조건이 있다. 그것부터 알아보자

 

ACID 특성, property라고도 부른다.

1.원자성(Atomicity)

-트랜잭션은 중간에 멈출 수 없다.

2.일관성(Consistency)

-트랜잭션 실행 전후 데이터베이스 내용이 일관되어야 한다.

3. 고립성(Isolation)

-트랜잭션이 실행하는 과정에서 갱신한 데이터는 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조할 수 없다.

 

** 위의 그림을 많이 봤다면 당신도 운영체제 고수!

고립성을 해결하기 위해선 여러가지 방법이 필요하다

-각 트랜잭션을 순차적으로 실행하는 것은 필수

But 다중 프로그래밍(Multi-programming)환경에서는 트랜잭션들을 순차적으로 실행하는 것이 힘들다.

-> 트랜잭션을 동시에 실행하면서 상호간에 간섭이 일어나지 않도록 하는 기법이 필요

 

????뭐지 뮤텍스인가? 세마포어인가? 이벤트오브젝트인가?  => 당신은 고수

 

이후 마지막 확인까지위해 동시에 실행되는 트랜잭션들의 실행 결과를 순차적으로 실행된 결과와 동일한지를 확인해야함

 

 

4.지속성(Durablity)

-트랜잭션이 성공적으로 완료되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장되어야 한다.

 


 

트랜잭션의 상태에 대해서 알아보자 ( -> 상태 전이도 , state diagram이 생각난다면 당신은 고수)

트랜잭션이 어떤 상태에 있는지 알아야? 중간에 멈춰지거나 완료되었는지를 알 수 있겠지? 

그리고 동시성 문제도 해결할 수 있겠지..?

 

상태에는 5가지가 있다.

1. 동작(active)

-> 트랜잭션이 시작되고 연산들이 정상적으로 실행 중인 상태

 

2. 완료(commited)

-> 트랜잭션이 성공적으로 종료된 상태

 

3. 실패(failed)

-> 트랜잭션이 완료되지 못하고 더 이상 실행되지 못하는 상태

 

4. 중단(aborted)

->트랜잭션이 실패한 후 실행되기 이전으로 복귀된 상태

 

5. 부분완료(partially committed)

-> 트랜잭션에 정의된 모든 연산의 실행이 끝난 상태

 

순서는 어떻게 진행되느냐??

 

우선 트랜잭션이 시작되면 '동작' 상태로 진입한다.  트랜잭션에 정의된 연산들이 정상적으로 진행된다.

모든 연산이 성공적으로 실행되면 '부분완료' 상태로 진입한다. (모든 연산이 실행이 완료를 의미하는 건 아님)

각 연산이 성공적으로 수행되었어도 디스크에 영구적으로 저장하는 것이 아니다. 

-> 만약 시스템에 장애가 발생하여 완료된 결과가 디스크에 반영되지 못하고 그 이전의 결과를 알 수 없다면 "지속성"을 유지하지 못함.

따라서 DBMS 자체에서 여러가지 검사 단계를 거쳐야 "완료"상태로 진입하고 트랜잭션이 종료될 수 있다.

(트랜잭션이 완료가 된다면 이 역시 "지속성"으로 인해 취소는 불가능하다.)

 

만약 만에 하나 "동작" 이나 "부분완료" 상태에서 트랜잭션이 정상적으로 실행되지 못하거나 오류를 발견한다면

"실패"상태로 진입한다.

 

All or Nothing의 원칙에 따라 완료할 수 없으면 다시 되돌려놓는 복귀 작업(rollback)이 필요하다. 

이 트랜잭션은 최종적으로 '중단'에 가고 모든 복귀 작업을 끝마치면 "종료"된다.

 

 

 

 

반응형
그리드형