이론공부/데이터베이스

트랜잭션이란 무엇인가?

멍토 2020. 8. 15.

트랜잭션은 작업의 완전성을 보장해주는 것이다.

논리적인 작업셋을 모두 완벽하게 처리하거나 또는 처리하지 못할경우에는 원 상태로 복구하여

작업의 일부만 적영되는 현상이 발생하지 않게 만들어주는 기능이다..


트랙잭션은 ACID라는 4가지  특성을 만족해야 한다.

원자성(Atomicity)

만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며

아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다.


일관성(Consistency)

트랜잭션이 완료되면 언제나 일관성 있는 데이터베이스 상태로 변환한다.

시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.



고립성(혹은 격립성, Isolation)

각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다.

수행중인 트랜잭션은 완전히 완료될때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.



지속성(Durability)

트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

트랜잭션의 상태

Active
- 트랜잭션의 활동상태.
- 트랜잭션이 실행중이며 동작중인 상태를 말한다.

Failed
- 트랜잭션 실패상태
- 더이상 정상적으로 진행 할 수 없는 상태를 말한다.

Partially Committed
- 트랜잭션의 Commit 명령이 도착한 상태
- commit 이전 sql문이 실행되고 commit만 남은 상태이다.

Committed
- 트랜잭션 완료상태
- 트랜잭션이 정상적으로 완료된 상태를 말한다.

Aborted
- 트랜잭션이 취소상태
- 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

 

Partially Committed 와 Committed의 차이점

Commit 요청이 들어오면 Partially Committed 상태가 된다.

이후 Commit을 문제없이 수행할 수 있으면 Committed상태가 되고

오류가 발생한다면 Failed 상태가 된다.

 

트랜잭션 사용시 주의할 점

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.

일반적으로 데이터베이스 커넥션은 개수가 제한적이다.

각 단위의 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수가 줄어든다.

그러다가 어느순간에는 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수 있다.

isolation 문제

isolation을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생한다.

반대로 동시성 처리를 높이기 위해 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있다.

1. Dirty Read
- 한 트랜잭션(T1)이 데이터에 접근해서 A라는 값을 B로바꾸고 커밋하지 않았을때, 다른 트랜잭션(T2)이 같은 데이터에 접근하여 데이터를 READ하면 T2가 읽은 데이터는 B가 된다. T1이 커밋을 실패하게 된다면 T2의 데이터는 망가지게 된다.

2. Non-Repeatable Read
- 한 트랜잭션(T1)이 데이터를 Read하고 있을때 다른 트랜잭션(T2)가 T1이 접근하는 데이터를 변경 혹은 삭제한다면 T1은 사라진 데이터 혹은 변경된 데이터를 찾게 된다.

3. Phantom Read
- 트랜잭션(T1)이 특정 조건으로 데이터를 검색하여 결과를 얻었을때, 다른 트랜잭션(T2)가 접근해 해당 조건의 데이터를 일부 삭제 혹은 추가했을때, 아직 끝나지 않은 T1 트랜잭션이 다시 해당조건으로 데이터를 조회하면 T2에서 추가/삭제한 데이터가 함께 조회/누락 된다. 이후 T2가 롤백을 하게된다면 데이터가 꼬이게 된다.

 

트랜잭션 격리수준(Isolation level)

격리수준은 보통 4단계로 구분한다.

1. Read Uncommitted
- 한 트랜잭션에서 커밋하지 않은 데이터에 다른 트랜잭션이 접근 가능하다.
- 즉, 커밋하지 않은 데이터를 읽을 수 있다.
- 격리성 문제가 발생할 수 있으나, 동시처리 성능은 가장 높다.
- 격리성 문제 3가지가 모두 발생할 수 있다.


2. Read Committed
- 커밋이 완료된 데이터만 읽을 수 있다.
- Dirty Read는 발생하지 않으나 다른 2가지 문제가 발생한다.


3. Repeatable Read
- 트랜잭션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.
- Dirty Read와 Non-Repeatable Read는 발생하지 않지만 결과가 달라지는 Phantom Read가 발생할 수 있다.


4. Serializable
- 가장 높은 격리 수준을 제공한다.
- Lock을 걸고있기 때문에 작업하고 있는 다른 트랜잭션은 데이터에 접근이 불가능해진다.
- 3가지 문제점을 모두 커버가 가능하다 동시 처리성능이 급격히 떨어질 수 있다.

교착상태(Dead Lock)

복수의 트랜잭션을 사용하다보면 교착상태가 일어날 수 있다.

교착상태란 두개 이상의 트랜잭션이 특정자원(테이블 or 행)의 잠금(Lock)을 획득한채

다른 트랜잭션이 소유하고 있는 잠금을 요구하면 아무리 기다려도 상황이 바뀌지 않는 상태가 되는데, 이를 교착상태라 한다.

 

교착상태의 빈도를 낮추는 방법

* 트랜잭션을 자주 커밋한다.

* 정해진 순서대로 테이블에 접근한다. 트랜잭션1은 A->B의 순으로 테이블에 접근하고 트랜잭션2가 B->A순으로 접근하는 것이 아니라 동일한 테이블 순으로 접근하게 한다.

* 읽기 잠금 획득(SELECT ~ FOR UPDATE)의 사용을 피한다.

* 한 테이블의 복수 행을 복수의 연결에서 순서없이 갱신하면 교착상태가 발생하기 쉽다.
이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화 하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.

출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#transaction

 

JaeYeopHan/Interview_Question_for_Beginner

:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - JaeYeopHan/Interview_Question_for_Beginner

github.com

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98

 

데이터베이스 트랜잭션 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성

ko.wikipedia.org

https://feco.tistory.com/45

 

트랜잭션, 트랜잭션 격리수준(Isolation Level)

1. 트랜잭션이 보장해야 하는 ACID 격리수준을 설명하기에 앞서 ACID에 대해 알아보자. 원자성 (Atomicity) : 한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주한다. 모두 성공 또는 모두 실�

feco.tistory.com

https://medium.com/@chrisjune_13837/db-transaction-isolation-level-f21b6d1e64eb

 

[DB] Transaction Isolation Level이란?

데이터베이스의 기초개념인 트랜젝션 격리수준에 대해 알아봅니다.

medium.com

 

'이론공부 > 데이터베이스' 카테고리의 다른 글

Index란 무엇인가?  (0) 2020.08.25

댓글

💲 광고입니다.