본문 바로가기
개발

데이터베이스 트랜잭션 정리하기

by 상5c 2021. 6. 28.

정의

시스템에서 상호작용의 단위. 영어 단어 transaction은 거래를 뜻한다.

나는 논리적 작업단위라는 말이 더 와닿았다. 송금 작업을 하나의 트랜잭션이라고 하면 이 트랜잭션은 인출과 입금이라는 연산작업을 모아둔 논리적 작업단위이다.

 

목적

데이터베이스 완전성(integrity) 유지

 

원자성 Atomicity

어떤 것이 더이상 쪼개질 수 없는 성질. 원자성을 가지고있으면 원자적이라 한다.

데이터베이스에서의 원자성

  • All or Nothing. 트랜잭션과 관련된 작업들이 일부만 실행되고 일부는 중단되지 않도록 보장하는 것을 의미하며 은행 송금으로 예를 드는 경우가 많다.

"A에게서 B로 10000원 송금"이 이루어지는 과정을 2단계로 나눴을때

  1. A의 계좌에서 10000원을 차감한다.
  2. B의 계좌에 10000원을 더한다.

이 작업이 순차적으로 이루어진다고 했을 때 1번이 성공한 후 시스템 오류로 인해 2번 작업이 실행되지 않고 과정이 종료되면 10000원이 없어져버리는 데이터 부정합이 발생한다. 따라서 1과 2를 합쳐서 "송금"이라는 하나의 덩어리로 봐야 한다. 송금이 성공하거나, 실패했거나 둘 중 하나의 결과물만 있어야 한다.

원자성은 중간 단계까지 실행하고 실패하는 일이 없도록 하는 것이다.

 

일관성 Consistency

트랜잭션이 성공하면 언제나 일관성있는 DB 상태를 유지하는 것. 모든 제약조건(무결성, 기본키, 외래키 등)을 지속적으로 만족해야 하며 위반하는 트랜잭션은 중단된다.

  • 예 1) 계좌 잔고가 마이너스가 되어선 안된다.
  • 예 2) 계좌의 종류는 "대출"과 "예금"만 가능하다.

 

독립성 Isolation

트랜잭션 수행시 다른 트랜잭션의 연산 작업과 겹치지 않는 것.

  • 예) 송금 작업 중에 "잔고" 영역에 다른 트랜잭션이 개입할 수 없는 것.

 

지속성 Durability

성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다. commit이 완료되었다면 로그를 통해 복구 가능하다.

두 가지 의미로, commit되었다면 복구 가능하며(로그를 남기며), 복구 가능한 상태가 되면 commit 한다.

 

트랜잭션 커밋(commit)

begin transaction
// 인출
// 입금
commit

commit은 트랜잭션이 성공적으로 수행되었음을 확정하는 명령이다. commit이 실행되어야 데이터베이스에 실제로 반영된다.

 

트랜잭션 롤백(rollback)

begin transaction
// 인출
// 입금
rollback

rollback은 트랜잭션이 실패했음을 알리는 명령이다. rollback 실행시 작업 이전 상태로 돌아가며, 관련 있는 작업들 모두 롤백 된다.

 

참고