트랜잭션

Bam·2025년 5월 10일
0

Database

목록 보기
34/39
post-thumbnail

트랜잭션 Transaction

트랜잭션 Transaction은 DBMS에서 사용되는 논리적인 작업 단위를 의미합니다.

트랜잭션을 정의해야하는 이유는 다음과 같습니다.

  • 쿼리 수행 중 장애 발생시 복구의 단위
  • 여러 작업이 동시에 같은 데이터를 조작하게 되는 경우 작업들을 분리하는 단위

트랜잭션은 하나의 단위로 묶이기 때문에 전체가 수행되거나 아예 수행되지 않아야합니다. (all or nothing)

만약 다음과 같은 쇼핑몰 결제 쿼리가 수행된다고 가정해봅니다.
1. 회원 계좌에서 인출
2. 회원에게 상품 배송
만약 1번 수행 후 서버에 장애가 발생했다면? 돈은 나갔지만 상품 배송 정보가 없어서 사용자에게 컴플레인이 들어오게 됩니다.
그래서 1번 수행 후 장애가 발생하면 아예 롤백을 시도하여 1번을 취소되게 해야합니다.

MySQL에서 트랜잭션 정의

MySQL은 기본적으로 autocommit 옵션이 켜져있기 때문에 따로 COMMIT;이라는 명령구를 붙이지 않아도 자동으로 하나의 SQL이 실행된 후에 커밋을 수행합니다.

그래서 트랜잭션을 정의하고 싶다면 autocommit 기능을 껐다 켜거나 명시적으로 트랜잭션을 정의하여 커밋하면 됩니다.

autocommit 끄기

SET SESSION autocommit = 0;

위 명령을 사용해서 autocommit 기능을 끌 수 있습니다. 끈 이후에는 하나 혹은 다수의 SQL을 수행한 후에 COMMIT; 명령을 통해서 트랜잭션을 커밋해야 데이터 조작이 반영됩니다.

autocommit을 다시 켜려면 값을 1로 변경하면 됩니다.

SET SESSION autocommit = 1;

명시적 트랜잭션 정의

또 다른 방법은 명시적으로 트랜잭션을 정의하고 실행하는 방법입니다.

START TRANSACTION

# SQL 구문들

COMMIT;
#or
ROLLBACK;

위와 같이 정의하면 트랜잭션 블록 내의 다수의 SQL 구문들이 하나의 트랜잭션 단위로 정의되어 수행됩니다.

수행 후 결과가 맞다면 COMMIT;으로 반영시키고 그렇지 않다면 ROLLBACK;을 통해 트랜잭션 작업을 취소합니다. 변경을 확정하거나 취소하는 COMMIT, ROLLBACK트랜잭션 제어 명령 TCL, Transaction Control Language라고 부릅니다.


트랜잭션의 네 가지 성질

트랜잭션은 네 가지 성질을 가지고 있습니다. 이 성질들의 앞 글자를 따 ACID 성질이라고 부르기도 합니다.

  • 원자성 Atomicity
    트랜잭션의 작업은 전부 수행되거나 전부 수행되지 않아야한다. (all or nothing)
  • 일관성 Consistency
    트랜잭션 수행 전후 데이터베이스는 반드시 일관한 상태를 유지해야한다.
  • 고립성 Isolation
    수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값의 훼손이 발생해선 안된다.
  • 지속성 Durability
    성공적으로 수행된 트랜잭션은 변경한 데이터를 영구 저장해야한다. 저장 후 데이터베이스는 장애나 오류에 영향을 받지 않아야한다.

DBMS에서는 ACID 성질을 지킬 수 있도록 원자성, 지속성에는 회복 관리자 프로그램, 일관성, 고립성에는 동시성 제어와 트랜잭션 고립 수준과 같은 기능들을 지원하고 있습니다. 이들에 대해서는 다음 포스트에서 더 자세히 알아보도록 하겠습니다.

0개의 댓글