안녕하세요. 개발자 Jindory입니다.
오늘은 트랜잭션 대해서 알아보는 글을 작성해보고자 합니다.
Transaction, 트랜잭션
Transaction(트랜잭션)이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위입니다.
데이터베이스의 상태를 변경시킨다는 이야기는 SELECT, UPDATE, INSERT, DELETE와 같은 행동을 뜻합니다.
이러한 트랜잭션은 상황에 따라서 여러 개가 만들어질 수 있습니다.
그 하나의 트랜잭션은 Commit(저장) 되거나 Rollback(철회) 될 수 있습니다.
예를들어 아래와 같은 상황이 발생한다고 가정해 봅시다.
A가 B에게 1만원을 송금해야하는 상황이고 현재 A는 2만원 B는 3만원을 가지고 있습니다.
이때 A가 B에게 송금을 보내기 위해서,
1) A에서 1만원의 금액이 있는지 확인한 후 있다면 10000을 차감한 값을 update한다.
2) 1만원을 B의 계좌쪽으로 전송한다.
3) B의 계좌에 1만원을 더한 4만원 값을 update한다.
이러한 일련의 과정을 거치다가 문제가 발생하여 전체 작업을 완료하지 못 했을때 일부만 변경사항만 반영된다면, 시스템을 신뢰하지 못 할 것입니다다.
이런 문제들을 해결하기 위해서 트랜잭션은 Commit과 Rollback을 이용합니다.
트랜잭션의 특징
트랜잭션에는 4가지 특징이 존재합니다.
- 원자성
- 일관성
- 독립성
- 지속성
원자성
원자성은 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나를 뜻합니다.
All or Nothing을 생각하면 됩니다.
트랜잭션이 발생하는 동안 아무런 문제가 없었다면, 변경된 사항을 모두 DB에 반영하면 되고,
트랜잭션이 발생하는 동안 문제가 발생했다면, 트랜잭션이 발생하는 동안의 변경사항을 DB에 반영하지 않으면 됩니다.
일관성
일관성은 트랜잭션 작업 처리의 결과가 항상 일관되어야 한다는 뜻합니다.
데이터베이스의 상태, 칼럼의 속성이 일관되게 유지되어야 한다는 의미입니다.
만일 트랜잭션 작업을 하는동안 데이터 베이스의 속성이 변경되더라도 변경된 데이터베이스에 트랜잭션이 진행되는것이 아니라, 처음 트랜잭션을 하기 위해 참조한 데이터베이스로 진행하게 됩니다.
이렇게 일관성을 유지함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것입니다.
독립성
독립성은 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임을 의미합니다.
즉, 각각의 트랜잭션은 독립적이라 서로 간섭이 불가능합니다.
위의 예시에서 A가 B에게 송금하고 C도 B에게 동시에 송금을 한다고 가정을 해 봅시다.
A도 B에게 1만원을 C도 B에게 1만원을 송금할때 B의 잔액을 3만원이라는 값에 동시에 만원이라는 값을 추가하면 4만원이 되어 2명이 송금했음에도 불구하고 결과는 1만원만 추가될 수 있게 됩니다.
그래서 트랜잭션은 격리 수준 설정을 통한 독립성 보장으로 각각의 다른 트랜잭션이 끼어들 수 없게 됩니다다.
지속성
지속성은 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 한다는 뜻을 의미합니다.
트랜잭션이 반영된 이후의 데이터를 어떠한 일이 발생하더라도 Database는 그 데이터를 유지해야한다고 할 수 있습니다.
이를 위해 트랜잭션은 log를 남겨서 어떤 장애에도 대비할 수 있도록 합니다.
트랜잭션의 Commit과 Rollback
Commit
Commit 연산은 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 관리자에게 알려주는 연산입니다.
Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨트렸을때, 이 트랜잭션의 일부가 정상적으로 처리 되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산으로 Rollback시에는 해당 트랜잭션을 재시작하거나 폐기합니다.
트랜잭션의 상태
트랜잭션은 논리적으로 5가지의 상태에 있을 수 있습니다.
- Active
- 트랜잭션이 현재 실행중인 상태
- Failed
- 트랜잭션이 실행되다 오류가 발생하여 중단된 상태
- Aborted
- 트랜잭션이 비정상적으로 종료되어 Rollback이 수행된 상태
- Partially Commited
- 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전의 상태
- Committed
- 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
이렇게 트랜잭션에 대해서 알아봤습니다.
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[ 참조 ]
'데이터베이스 > Database' 카테고리의 다른 글
[Database] 관계형 데이터베이스(SQL)와 비관계형 데이터베이스(NoSQL)의 차이 (0) | 2022.04.25 |
---|---|
[Database] Oracle과 MySQL의 차이점 (0) | 2022.04.13 |