트랜잭션(Transaction)

트랜잭션(Transaction) 정의


트랜잭션은 하나 이상의 데이터 교환 또는 변경 작업을 하나의 단위로 묶어 안전하게 처리하는 것을 의미합니다.

하나의 트랜잭션은 최종적으로 커밋(Commit) 또는 롤백(Rollback) 중 하나로 종료됩니다.

Image

  • 커밋(Commit): 모든 작업이 정상적으로 완료되어 데이터베이스에 변경사항이 영구적으로 반영됩니다.
  • 롤백(Rollback): 작업 중 오류가 발생하면, 트랜잭션 시작 이전의 상태로 모든 변경 사항이 되돌려집니다.

여러 데이터에 대한 변경 작업이 모두 성공적으로 완료되어야 데이터베이스에 변경사항이 영구적으로 반영되고, 만약 작업 중 하나라도 실패하면 전체 작업이 이전 상태로 되돌아갑니다.

트랜잭션 ACID 속성


ACID는 트랜잭션은 정의하는 4가지 속성을 가리키는 약어입니다.

  • 원자성(Atomicity)
    • 모든 트랜잭션은 데이터 베이스에 모두 반영되거나 아니면 전혀 반영되지 않아야 합니다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽하게 수행되어야하며, 하나라도 오류가 발생하면 트랜잭션내의 모든 작업 전부가 취소되어야합니다.
  • 일관성(Consistency)
    • 트랜잭션이 실행을 성공적으로 Commit을 완료하면 언제나 일관성 있는 데이터베이스 상태로 보존되어야 합니다.
    • 시스템이 가진 불변 속성은 트랜잭션 수행 전과 수행 후에 동일해야 합니다.
      • 예를 들어, 미리 정의된 무결성 제약조건은 트랜잭션과 관계없이 유지되어야 합니다.
  • 격리성(Isolation)
    • 두 개 이상의 트랜잭션이 병행적으로 실행되는 경우, 어느 한 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없습니다.
    • 수행 중인 트랜잭션은 완전히 완료될 때까지, 다른 트랜잭션에서 그 수행 결과를 참조할 수 없습니다.
      • 이를 위해 행 단위 락, 페이지 또는 테이블 단위 락을 사용합니다.
  • 영속성(Durablility)
    • 성공적으로 완료된 트랜잭션 결과는 시스템이 고장나더라도 영구적으로 반영되어야합니다.
      • 시스템의 메모리뿐만 아니라 디스크나 SSD와 같은 비휘발성 저장 장치에 기록되어, 데이터베이스가 고장나더라도 복구할 수 있도록 보장합니다.

트랜잭션 동작 원리


정확히는, Manual Commit에서의 트랜잭션 동작 원리입니다.

Image

  • 커넥션 수립 및 세션 할당
    • 사용자는 WAS 또는 DB 접근툴 등의 클라이언트를 통해 데이터베이스 서버에 연결 요청을 보냅니다.
    • 클라이언트는 데이터베이스 서버에 연결 요청을 보내고, 서버는 해당 요청에 대해 커넥션(Connection)을 맺어줍니다.
    • 데이터베이스 서버는 각 커넥션마다 내부적으로 세션을 할당하며, 이미 생성된 세션이 있다면 재활용하여 클라이언트의 요청을 처리합니다.
  • 트랜잭션 시작
    • 세션 내에서 트랜잭션이 시작됩니다.
    • 일반적으로 BEGIN 또는 START TRANSACTION 명령을 통해 트랜잭션 경계가 설정됩니다.
    • 이후 실행되는 모든 SQL 명령은 이 트랜잭션의 일부로 처리됩니다.
  • SQL 명령 실행
    • 트랜잭션 내에서 여러 데이터 변경 작업(INSERT, UPDATE, DELETE 등) 또는 조회 작업(SELECT)이 순차적으로 실행됩니다.
    • 트랜잭션 내에서 이루어지는 데이터 변경 작업은 해당 세션 내에서만 임시적으로 저장되며, 트랜잭션이 커밋되기 전까지 다른 세션에서는 볼 수 없습니다.
  • 트랜잭션 종료: 커밋 또는 롤백
    • 모든 SQL 작업이 정상적으로 완료되면, COMMIT 명령을 실행하여 변경사항을 영구적으로 데이터베이스에 반영합니다.
    • 만약 하나라도 오류가 발생하면, ROLLBACK 명령을 실행하여 트랜잭션 시작 전의 상태로 모든 변경사항을 취소합니다.
  • 세션 종료 및 커넥션 재활용
    • 트랜잭션이 종료되면 해당 세션은 결과를 반영한 상태로 유지되거나, 커넥션 풀에 반환되어 재활용됩니다.
    • 이후 동일한 커넥션을 통해 새로운 트랜잭션을 시작할 수 있습니다.

추가설명 : Auto Commit vs Manual Commit


  • Auto Commit
    • 일반적으로 데이터베이스의 기본 설정입니다.
    • 단일 SQL 명령어마다 자동으로 트랜잭션이 생성되어 바로 커밋됩니다.
    • 간단한 작업에는 편리하지만, 여러 관련 작업을 하나의 단위로 묶어 처리하기에는 부적합합니다.
  • Manual Commit
    • 개발자가 트랜잭션의 시작과 종료를 명시적으로 관리하여 여러 SQL 명령어를 하나의 트랜잭션으로 처리할 수 있습니다.
    • 복잡한 비즈니스 로직이나 원자성이 중요한 경우에 사용됩니다.
    • 많은 애플리케이션 프레임워크에서는 트랜잭션의 원자성을 보장하기 위해 Auto Commit을 비활성화하고 Manual Commit 방식으로 트랜잭션을 관리합니다.

참고자료


[Database] 트랜잭션의 동작 원리와 ACID 속성

[DB기초] 트랜잭션이란 무엇인가?

[DB] 트랜잭션 (Transaction)