트랜잭션(Transaction)

이상민·2025년 12월 2일

TIL

목록 보기
48/48

트랜잭션이란 ?

트랜잭션(Transaction)은 작업의 완전성을 보장해주기 위해 사용되는 개념으로, 특정한 작업을 전부 처리하거나, 전부 실패하게 만들어 데이터의 일관성을 보장해주는 기능을 의미한다.

트랜잭션을 왜 사용하나요?

예를들어 은행에서 계좌이체를 하게 될 경우 아래와같은 상황이 발생할때
1️⃣  A 고객의 계좌에서 1,000원을 차감합니다.
2️⃣  B 고객의 계좌에 1,000원을 추가합니다.
여기서 1️⃣ 번 작업 이후 2️⃣ 번 작업을 수행하던 중 에러가 발생하게 될 경우 A 고객의 계좌에서 1,000원만 차감되기만 하는 문제점이 발생하게된다. 만약 순서가 반대로 되었다면, B 고객의 계좌에 1,000원이 증가되기만 하는 문제가 발생하여 이런 부분 업데이트(Partial Update)와 같은 상황을 방지하기 위해 트랜잭션(Transaction)이라는 개념을 도입하게 되었다.

  • 단순히 위와 같은 상황 외에도 작업한 내역을 저장하는 로깅작업, 영화관의 예매 시스템, 은행의 결제 시스템 등 데이터의 일관성을 유지해야하는 다양한 상황에서 사용된다.

    결국, 트랜잭션(Transaction)을 이용한다면 사용자가 항상 어플리케이션 실행을 완료하도록 구성할 수 있게되고, 실행을 중단할 만한 치명적인 오류가 발생하더라도, DB에 피해가 가지않아 더욱 안전하게 어플리케이션을 구성할 수 있게 된다.

트랜잭션의 특징(ACID)

원자성(Atomicity)

  • 원자성(Atomicity)은 트랜잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리하여, 내부에서 실행된 명령들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징이다. 원자성(Atomicity)은 트랜잭션의 가장 대표적인 특징으로, 트랜잭션에서 실행되는 쿼리마다 하나의 작업 단위로 보지않고, 여러개의 작업들을 묶어 하나의 작업단위로 보게된다.

📌 계좌이체의 비즈니스 로직
1️⃣  A 계좌의 금액을 차감합니다.
2️⃣  B 계좌의 금액을 증가 시킵니다.

일관성(Consistency)

  • 일관성(Consistency)은 트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야하는 특징이다. 만약 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않는 특징을 가지고 있다.

📌 강의 등록의 비즈니스로직
1. 강의(Courses) 테이블에서 강의를 생성
2. 생성된 강의 데이터를 참조하는 강의 목록(CourseUnit) 테이블에 강의 영상을 업로드
3. 강의 목록(CourseUnit) 테이블에 모든 강의 영상을 업로드 하였다면 COMMIT

  • 이처럼 첫번째 강의 테이블에 강의를 생성하는것은 성공하였지만 두번째 강의 목록 테이블에서 모든 강의 영상을 삽입하는데 실패하였다면, ROLLBACK이 실행되어 강의(Courses) 테이블과 강의 목록(CourseUnit) 테이블에는 트랜잭션 시작 전 상태로 복구된다.

  • 이렇게, 데이터는 강의 자체가 생성되지 않거나, 모든 강의가 업로드 되는 상황이 발생하게 되어야, 일관성을 유지할 수 있을 것이고, 데이터베이스를 믿고 작업을 진행할 수 있게 될 것이다.

격리성(Isolation)

  • 격리성(Isolation)은 트랜잭션이 실행 중인 경우 다른 트랜잭션에 의해 데이터가 변경되는 것을 방지하는 특징이다. 트랜잭션이 완전히 수행되거나 완전히 수행되지 않은 상태를 외부에서 참조할 수는 있지만, 트랜잭션의 중간 과정이나 중간 결과를 볼 수 없도록 하는 특징을 가지고 있다.

격리성(Isolation)의 경우, MySQL에서는 사용중인 DB 오브젝트에 락(Lock)을 걸어 격리성을 구현하게 된다. 여기서 락(Lock)을 건 상태는 DB에 접속한 또다른 클라이언트가 해당 DB 오브젝트를 읽거나, 사용할 수 없도록 방지하여, 데이터 무결성을 보장하게 된다. 격리성이란 특징에서 동시성(Concurrency)과 격리 수준(Isolation Level)라는 두 가지 중요한 개념이 나타나게되었다.

동시성(Concurrency)이란❓ 

  • 동시성(Concurrency)은 여러 클라이언트가 동시에 하나의 데이터를 사용및 공유 하는 것을 뜻한다. 동시성은 다수의 사용자가 동일한 시스템을 공유하면서 발생하는 동시 접근 문제를 해결해야 한다.
  • 동시성 문제(Concurrency Issue)는 여러 클라이언트가 동시에 같은 데이터를 접근하려고 할 때 발생한다.

📌 2개의 계좌이체가 발생한다고 가정하자.
1. 1️⃣  트랜잭션에서 A 계좌에서 천원을 차감하여 10,0009,000으로 수정하였습니다.
2. 2️⃣  트랜잭션에서 아직 커밋 되지 않은 1️⃣ 트랜잭션의 데이터를 바탕으로 A 계좌에서 천원을 차감하여 9,0008,000으로 수정하였습니다.
3. 1️⃣  트랜잭션에서 에러가 발생하여, 트랜잭션을 ROLLBACK하게 되었습니다. 따라서, A 계좌의 잔고는 원래대로 10,000이 되었습니다.
4. 그런데 2️⃣  트랜잭션에서 잘못된 데이터를 바탕으로 작업을 수행한 후 트랜잭션을 COMMIT 하게 되었습니다. 그로인해 A 계좌의 잔고가 8,000으로 잘못 표시되는 문제가 발생하였습니다.

  • 위의 예시에서 볼 수 있듯이, 동시에 여러 트랜잭션이 동일한 데이터에 접근할 때는 데이터의 일관성을 유지하기 어려울 수 있다.

이러한 문제를 해결하기위해, 자원을 사용하는 하나의 클라이언트만 해당 자원을 점유할 수 있도록 하여, 다른 사용자가 접근할 수 없도록 만들어 자원을 공유하는 원인을 제거하면 된다. 이것을 자원 잠금(Resource Locking)라고 부르며, 락(Lock)이라는 개념이 나오게 된 것이다.

지속성(Durability)

💡 지속성(Durability)은 트랜잭션이 성공적으로 커밋된 후, 해당 트랜잭션에 의해 생성 또는 수정된 데이터가 어떠한 상황에서도 보존되는 특징이다.
다시 말해, 트랜잭션이 완료되면 결과는 데이터베이스에 영구적으로 저장되며, 이후 시스템에 어떠한 문제가 생기더라도 데이터는 손상되지 않는다.

  • 지속성(Durability)은 트랜잭션의 안전성을 보장하며, 데이터 손실 없이 시스템의 안정성을 유지하는데 중요한 역할을 담당한다.

  • 트랜잭션이 성공적으로 완료되면, 해당 트랜잭션에 의해 생성 또는 변경된 데이터는 데이터베이스에 COMMIT 명령을 통해 영구적으로 저장된다. 하지만, 트랜잭션 수행 도중 시스템이 비정상 종료되더라도, 시스템은 트랜잭션 로그(Transaction Log)를 통해 아직 커밋되지 않은 트랜잭션을 복구할 수 있다.

MySQL에서 트랜잭션 살펴보기

-- 트랜잭션을 시작합니다.
START TRANSACTION;

-- 성공시 작업 내역을 DB에 반영합니다.
COMMIT;

-- 실패시 START TRANSACTION이 실행되기 전 상태로 작업 내역을 취소합니다.
ROLLBACK;

0개의 댓글