트랜잭션

김형준 Kim Hyeong Jun·2022년 12월 8일
2
post-custom-banner

트랜잭션(Transaction)은 "쪼갤 수 없는 업무 처리의 최소 단위"를 말한다.

예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다.
만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다.
이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다.
이런 거래의 최소 단위를 트랜잭션이라고 한다.

  • 트랜잭션 처리가 정상적으로 완료된 경우 커밋(COMMIT)을 하고, 오류가 발생할 경우 원래 상태로 롤백(ROLLBACK)을 한다.

  • 데이터 베이스 기능 중, 트랜잭션을 조작하는 기능은 데이터베이스 완전성(integrity) 유지를 확신하게 된다.

완전성 : 데이터는 결측치, 오류를 가지지 않아야 함.


ACID

데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야한다.

각각을 살펴보자

A

Atomicity - 원자성

하나의 트랜잭션은 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다. 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야한다.
ALL or NOTHING 의 개념으로 작업 단위를 일부분만 실행하지 않는다는 것을 의미한다.

  • 원자성 보장 : 트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 커밋된 상태를 임시 영역에 따로 저장함으로써 보장한다. 이전 데이터들이 임시로 저장되는 영역을 롤백 세그먼트(rollback segement)라고 한다.
    확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점인 세이브포인트(save point)를 지정할 수 있다.

C

Consistency - 일관성

트랜잭션이 완료된 결과값이 일관적인 DB 상태를 유지하는 것을 말한다.
시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 하며 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것으로
트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 엡데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라,
처음 트랜잭션을 진행하기 위해 참조한 데이터 베이스로 진행된다.

트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은 명시적인 무결성 제약 조건들뿐만 아니라,
A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 한다는 사항과 같은 비명시적인 일관성 조건들도 있다.

  • 일관성 보장 : 트랜잭션에서 일관성은 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(기본 키, 외래 키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장한다.
    예를 들어 Movie와 Video 테이블이 있을 때 Video 테이블의 기본 키(primary key)인 movie_id가 외래키로 존재한다고 가정한다.
    만약 movie_id의 제약 조건이 Movie 테이블에서 변경되면, Video 테이블에서도 movie_id가 변경되어야 한다.
    한 쪽의 테이블에서만 데이터 변경사항이 이루어져서는 안되는 것이다.
    이때 트랜잭션의 일관성을 보장하기 위한 방법은 어떤 이벤트와 조건이 발생했을 때, 트리거(Trigger)를 통해 보장하는 것이다.
    트리거는 '방아쇠'라는 뜻인데, 데이터베이스 시스템이 자동적으로 수행할 동작을 명시할 때 사용된다.
    즉, 어떤 행위의 시작을 알리는 것이다.

I

Isolation - 고립성

하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다.
즉, 트랜잭션 끼리는 서로를 간섭할 수 없다.
트랜잭션이 실행되는 도중에 변경한 데이터는 해당 트랜잭션이 완료될 때까지 다른 트랜잭션에서 참조하지 못하게 하는 특성이다.

  • 고립성 보장 : 트랜잭션에서는 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용하는 공유 록(shared_lock)을 한다.
    공유 록은 데이터 쓰기를 허용하지 않고 오직 읽기만 허용하는 것이다.
    또한 데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 하는 배타 록(exclusive_lock)을 사용한다.
    그리고 읽기, 쓰기 작업이 끝나면 언락을 통해 다른 트랜잭션이 록(lock)을 할 수 있도록 데이터에 대한 잠금을 풀어준다.
    단, 록(lock)과 언락을 잘못 사용하면 데드락(deadlock)상태에 빠질 수 있으므로 주의해야 한다.

D

Durability - 지속성

트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.
지속성은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것이다.
즉, 정상적으로 완료 혹은 부분 완료된 데이터는 DBMS 가 책임지고 데이터베이스에 기록하는 성질이 지속성이며 영속성이라고 표현하기도 한다.


스프링에서 @Transactional을 사용하는 법

어노테이션을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다.

@Transactional
public void addUser(UserDto userDto) throws Exception {
	//로직 구현
}

@Transactional 옵션

  1. isolation : 일관성 없는 데이터 허용 수준을 설정
  2. propagation : 트랜잭션 동작 중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션 설정
  3. noRollbackFor : 특정 예외 발생 시 rollback 하지 않는다.
  4. rollbackFor : 특정 예외 발생 시 rollback 한다.
  5. timeout : 지정 시간 내에 트랜잭션 수행이 완료되지 않으면 rollback 한다. (-1 일 경우 사용 X)
  6. readonly : 트랜잭션을 읽기 전용으로 설정한다.
profile
I want be a developer🙂
post-custom-banner

0개의 댓글