트랜잭션 Transaction
은 DBMS에서 사용되는 논리적인 작업 단위를 의미합니다.
트랜잭션
을 정의해야하는 이유는 다음과 같습니다.
트랜잭션
은 하나의 단위로 묶이기 때문에 전체가 수행되거나 아예 수행되지 않아야합니다. (all or nothing)
만약 다음과 같은 쇼핑몰 결제 쿼리가 수행된다고 가정해봅니다.
1. 회원 계좌에서 인출
2. 회원에게 상품 배송
만약 1번 수행 후 서버에 장애가 발생했다면? 돈은 나갔지만 상품 배송 정보가 없어서 사용자에게 컴플레인이 들어오게 됩니다.
그래서 1번 수행 후 장애가 발생하면 아예 롤백을 시도하여 1번을 취소되게 해야합니다.
MySQL
은 기본적으로 autocommit
옵션이 켜져있기 때문에 따로 COMMIT;
이라는 명령구를 붙이지 않아도 자동으로 하나의 SQL이 실행된 후에 커밋을 수행합니다.
그래서 트랜잭션을 정의하고 싶다면 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 성질
이라고 부르기도 합니다.
all or nothing
)DBMS에서는 ACID 성질을 지킬 수 있도록 원자성, 지속성에는 회복 관리자 프로그램, 일관성, 고립성에는 동시성 제어와 트랜잭션 고립 수준과 같은 기능들을 지원하고 있습니다. 이들에 대해서는 다음 포스트에서 더 자세히 알아보도록 하겠습니다.