본문 바로가기
DB

트랜잭션과 트랜잭션의 특징

by y00ns00 2021. 6. 29.

트랜잭션 이란??

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

 

예) 한계좌에서 10만원을 인출하여 다른 계좌로 10만원 입금하는 이체 작업은 전체 작업이 정상적으로 완료되거나,

만약 정상적으로 처리될 수 없는경우에는 아무것도 실행되지 않은 처음 상태로 되돌려야 한다.

이러한 트랜잭션은 다양한 데이터 항목들을 액세스하고 갱신하는 프로그램 수행의 단위가 된다.

 

commit or rollback (모두 실행되거나 아무 쿼리도 실행되지 않는다).

트랜잭션은 ACID 성질이라고 하는 네가지 성질을 가진다.

 

Atomicity(원자성) :트랜잭션의 모든 연산들이 정상적으로 수행완료 되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다

이체과정중에 트랜잭션이 실패하게 되어 예금이 사라지는 경우가 발생해서는 안 되기 때문에

DBMS는 완료되지 않은 트랜잭션의 중간 상태를 데이터베이스에 반영해서는 안된다.

즉, 트랜잭션의 모든 연산들이 정상적으로 수행완료 되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다. ( all of nothing) 특성으로 설명된다.

 

Consistency(일관성) : 고립된 트랜잭션의 수행이 데이터베이스의 일관성을 보존해야한다.

즉, 성공적으로 수행된 트랜잭션은 정당한 데이터들만을 데이터베이스에 반영해야한다.

트랜잭션의 수행을 데이터베이스 상태간의 전이(transition)으로 봤을 때, 

트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다.

트랜잭션 수행이 보존해야할 일관성은 기본키, 외래키 제약과 같은 명시적인 무경성 제약 조건들뿐만 아니라, 자금이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야한다는 사항과 같은 비명시적인 길관성 조건들도 있다.

 

-> 일관성 보장

트랜잭션 수행 전,후에 데이터 모델의 모든 제약조건을(기본키,외래키,도메인 등)을 만족하는것

위의 상황의 경우 Movie 테이블이 변경되면, Video 테이블에서도 movie_id가 변경되어야 함.

 

이때, 필요한 것이 트리거 (Trigger)

 

트리거는 특정 테이블에 insert, delete, update 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램.

어떤 이벤트 조건 발생했을 때, 트리거( Trigger )를 통해 보장합니다.

1~5 LINE

트리거 선언

movie 테이블에 update가 발생하면 그 이후(after) each row에 대해 trigger를 적용한다라는 뜻.

declare 선언문에는 변수 선언

 

create는 트리거를 생성하는 코드이고 after는 트리거가 실행되기 위한 event를 나타낸다.

 

Isolation(독립성) : 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행되어야 한다.

즉, 한 트랜잭션의 중간 결과가 다른 트랜잭션에게는 숨겨져야한다는 의미인데,

이러한 isolation성질이 보장되지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없게된다.

Isolation성질을 보장할 수 있는 가장 쉬운 방법은 모든 트랜잭션을 순차적으로 수행하는것.

하지만 병렬적 수행의 장점을 얻기 위해서 DBMS는 병렬적으로 수행하면서도 일렬(serial)수행과 같은 결과를 보장할 수 있는 방식을 제공하고 있다.

 

1) 병행 처리 ( concurrent processing )

CPU가 여러 프로세스를 처리하는 것처럼, 트랜잭션에 정해진 시간을 할당해서 작업을 하다가 부여된 시간이 끝나면 다른 트랜잭션을 실행하는 이런 방식으로 트랜잭션들을 조금씩 처리하는 것을 말합니다.

그런데 이렇게 되면 많은 트랜잭션들이 조금씩 처리되는 과정에서 공통된 데이터를 조작하게 되는데, 이 경우 데이터가 혼란스러워 질 수 있습니다.

 

예를 들어, A 트랜잭션에서 x라는 데이터를 100으로 설정한 후 시간이 만료되어 B 트랜잭션으로 넘어갔다고 가정해보겠습니다.

B 트랜잭션에서는 x 데이터에 -50 연산을 해서 저장을 했을때, 시간이 만료되어 다시 A 트랜잭션이 실행될 경우 x 데이터의 값은 50이 됩니다.

이렇게 트랜잭션이 조금씩 수행될 때, 공통된 데이터가 다른 트랜잭션에 의해 방해되면 안됩니다.

이와 같이 트랜잭션의 간섭이 일어날 경우 갱신분실, 오손판독, 반복불가능, 팬텀문제 등 여러 문제점들이 발생합니다.

 

2) 고립성 보장

병행처리 과정에서 트랜잭션의 고립성이 왜 보장되어야 하는지를 알게되었습니다.

 

그러면 고립성을 어떻게 보장할 수 있을까요?

OS의 세마포어(semaphore)와 비슷한 개념으로 lock & excute  unlock을 통해 고립성을 보장할 수 있습니다.

즉, 데이터를 읽거나 쓸 때는 문을 잠궈서 다른 트랜잭션이 접근하지 못하도록 고립성을 보장하고, 수행을 마치면 unlock을 통해 데이터를 다른 트랜잭션이 접근할 수 있도록 허용하는 방식입니다.

 

트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용하는 shared_lock을 합니다.

즉, shared_lock은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용합니다.

 

또한 데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 exclusive_lock을 사용합니다.

그리고 읽기, 쓰기 작업이 끝나면 unlock을 통해 다른 트랜잭션이 lock을 할 수 있도록 데이터에 대한 잠금(lock)을 풀어줍니다.

 

그런데 lock과 unlock을 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있습니다.

모든 트랜잭션이 아무것도 수행할 수 없는 상태가 되는 것이죠.

 

 

 

 

3) 2PL 프로토콜 ( 2 Phase Locking protocol )

당연히 데드락이 걸리면 안되므로, 어떤 규칙에 의해서 고립성을 보장해야 한다는 2PL 프로토콜이 연구되었습니다.

2PL 프로토콜이란 여러 트랜잭션이 공유하고 있는 데이터에 동시에 접근할 수 없도록 하기위한 목적을 가진 프로토콜입니다.

 

이름 그대로 2가지 단계의 locking이 존재하는데, 한 가지는 growing phase이고 다른 한 가지는 shrinking phase입니다.

상승 단계란 read_lock , write_lock을 의미하고, 하강 단계란 unlock를 의미합니다.

 

2PL 프로토콜은 상승 단계와 하강 단계와 섞이면 안된다는 것을 의미합니다.

즉, lock과 unlock이 번갈아 수행되지 않고 lock이 쭉 수행된 후에 unlock이 쭉 수행되어야 한다는 것이 이 프로토콜입니다.

 

정리하면 성능을 위해 병행처리를 해야하는데, 트랜잭션의 고립성을 보장하기 위해서는 2PL을 사용해야 한다는 것입니다. ( Serializable Schedule )

 

참고로 locking을 하는 방법에도 두 가지가 있습니다.

  • 보수적 locking ( conservative locking )
    • 트랜잭션이 시작되면 모든 lock을 얻는 방식으로서, 데드락이 발생하지 않지만 병행성이 좋지 못함
  • 엄격한 locking ( strict locking )
    • 트랜잭션이 commit을 만날 때까지 lock을 갖고 있다가 commit을 만날때 unlock을 하는 방식으로 데드락이 발생하지만 병행성이 좋음
    • 일반적으로 병행성이 좋은 strict 방식을 사용합니다.

 

Durability(지속성) :트랜잭션이 성공적으로 완료되어 커밋되고 나면 해당 트랜잭션에 의한 모든 변경을 향후에 어떤 소프트웨어나 하드웨어 장애가 발생되더라도 보존되어야한다.

 

 

참조: 네이버 D2, https://victorydntmd.tistory.com/129

'DB' 카테고리의 다른 글

인덱스란 ?  (0) 2021.08.03
NoSQL  (0) 2021.07.24
Redis란? 왜 사용할까?  (0) 2021.07.24

댓글