[Database] 트랜잭션이란?

나른한 개발자·2022년 5월 3일
0

데이터베이스

목록 보기
2/2

1. 트랜잭션

트랜잭션이란 한번 이상의 데이터베이스 접근을 수반하는 최소한의 논리적 작업 단위이다. 예를 들어 상품의 구매와 재고를 DBMS로 관리한다고 생각해보자. 사용자가 상품을 구매하면 구매 내역 관리 테이블에 소비자의 구매 내역이 추가되면서 동시에 상품 재고가 줄어야할 것이다. 주문 테이블 업데이트는 성공했지만 상품 재고를 업데이트하는 작업이 실패할 경우 데이터의 정합성을 해치게 된다. 이때 주문 관련 테이블에 업데이트하는 작업과 상품 테이블의 재고를 수정하는 두 개의 데이터베이스 접근을 하나의 작업단위로 처리하여 두 번의 쿼리가 모두 실행되거나 실행되지 않도록 하는 것이 트랜잭션이다.

이처럼 데이터의 정합성을 유지하고 에러 발생 시 복구할 수 있도록 하거나 여러 사용자가 같은 작업을 동시 요청할 때 이를 다루기 위해 트랜잭션을 사용한다.


2. 특징 - ACID

ACID는 데이터베이스의 무결성을 지키기 위한 속성이다.

Atomicity 원자성
트랜잭션이 DB에 모두 반영되거나 반영되지 않아야 한다.

트랜잭션 수행 시 에러가 발생하여 연산을 모두 끝마치지 못했다면 트랜잭션으로 묶여있는 작업을 모두 취소하고 트랜잭션 수행 이전 상태로 복구되어야한다.

  • Consistency 일관성
    트랜잭션 처리 결과는 항상 일관성 있어야한다.

트랜잭션 수행 전 데이터의 일관된 상태를 트랜잭션 수행 후에도 유지해야한다.

Isolation 독립성
둘 이상의 트랜잭션이 병행 실행되고 있을 때 어떤 트랜잭션 연산도 중간에 다른 트랜잭션에 끼어들 수 없다.

예를 들어 a가 b에게 돈을 송금하는 트랜잭션과 a 계좌에 예금 이자가 입금되는 두 개의 트랜잭션 요청이 들어왔을 때 한 트랜잭션이 수행되는 도중에 다른 트랜잭션이 이에 끼어들 수 없다. 한 트랜잭션이 모두 수행된 후 다른 트랜잭션이 수행될 것이다.

이처럼 독립성을 완전히 보장하려면 트랜잭션이 순서대로 처리되어야하기 때문에 동시 처리 성능을 저하시킨다. 따라서 격리성 보장 수준을 다음과 같이 나눌 수 있다.

  • Read uncommited: 커밋하지 않은 데이터를 읽을 수 있다. 트랜잭션을 수행하며 데이터 수정 도중 커밋되지 않은 데이터를 조회할 수 있음을 의미하며 트랜잭션 롤백이 일어나면 데이터 정합성이 깨질수 있다.

  • Read commited: 커밋된 데이터만 읽을 수 있다.

  • Repeatable read: 한번 조회한 데이터는 같은 트랜잭션 내에서 다시 조회해도 같은 결과가 나올 수 있도록 하는 것이다. 하지만 데이터 조회 후 다른 사용자가 데이터 수정을 하였다면 다시 조회했을 시 결과 집합이 달라질 수 있다.

  • Serialable: 트랜잭션을 순차적으로 실행하는 것이다. 실제 업무에서는 동시 처리를 위해 read commit 수준으로 독립성을 보장한다.

Durability 지속성
트랜잭션이 실패하거나 성공되었으면 그 결과는 영구적으로 반영되어야 한다.

시스템 장애가 발생하더라도 트랜잭션 수행 결과는 영구적으로 데이터베이스에 반영된 상태여야한다.


3. 명령어

Commit

트랜잭션 연산이 성공적으로 끝마친 경우 변경사항을 한꺼번에 데이터베이스에 반영하는 명령어이다.

Rollback

트랜잭션 연산이 부분적으로 실패했을 경우 트랜잭션 내의 연산 모두를 소급하여 취소하여 트랜잭션 실행 이전의 상태로 돌아가는 명령어이다.

Savepoint

트랜잭션 연산 실패 시 작업을 모두 취소하지 않고 특정 지점까지만 되돌리고 싶을 때 savepoint를 지정할 수 있다. SAVEPOINT 세이브포인트이름과 같이 세이브포인트를 지정하고 ROLLBACK TO 세이브포인트이름 명령어를 사용하면 특정 지점까만 롤백할 수 있다.


참고
DB를 지탱하는 트랜잭션
트랜젝션(transaction)이란 무엇인가?

profile
Start fast to fail fast

0개의 댓글