데이터베이스 관리 시스템에서의 Rollback과 Commit은 트랜잭션을 관리하기 위한 핵심 개념입니다.
트랜잭션은 한 개 이상의 SQL문으로 이루어진 작업을 위한 논리적인 작업단위로써 분할할 수 없는 최소 수행단위이다.
트랜잭션은 DML과 DDL 명령어를 포함할 수 있으며, 연산의 집합이지만 논리적으론 하나로 보아야 하며 데이터베이스의 일관성과 무결성을 유지하기 위해 사용된다.
트랜잭션의 필요성에 관한 예로, 누군가에게 100만원을 송금할 때 UPDATE 구문이 다음과 같은 순서로 실행된다고 가정하면 A계좌의 UPDATE 구문이후 B계좌의 정보가 UPDATE된다.
이 때 A계좌의 UPDATE 쿼리가 실행된 후 예상치못한 오류가 발생한다면 A계좌의 데이터(100만원)는 사라지게된다.
![]()
만약 두 개의 UPDATE 구문을 하나의 트랜잭션에 담는다면 오류가 발생하더라도 데이터가 사라지는 상황을 방지할 수 있다. 트랜잭션 내에 있는 명령어는 모두 수행되거나 모두 수행하지 않기 때문인데('ALL OR NOTHING') 트랜잭션의 특징 중 원자성에 해당한다.
원자성(Atomicity) : 트랜잭션의 연산은 모두 반영되든지(ALL) 혹은 전혀 반영되지 않아야한다(NOTHING).
일관성(Consistency) : 트랜잭션 실행 후 데이터베이스의 무결성은 유지되어야한다.
격리성,독립성(Isolation) : 트랜잭션 실행 중에는 다른 트랜잭션이 접근할 수 없다.
영속성(Durability) : 트랜잭션의 결과는 계속 유지되어야한다.
-- 트랜잭션 시작 START TRANSACTION; -- 또는 BEGIN; -- A 계좌에서 출금 UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- B 계좌에 입금 UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 성공 시 반영 COMMIT; -- 실패 시 전체 취소 예 START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 999; -- 존재하지 않는 계좌 -- 에러 발생 ROLLBACK; -- 위 두 UPDATE 모두 취소됨
SQL에서는 트랜잭션을 제어하는 명령어를 따로 분리해 TCL(Transaction Control Language)이라고 구분하기도 한다. TCL에는 트랜잭션을 반영하는 COMMIT과 취소하는 ROLLBACK이 있다.
수행한 트랜잭션 명령어(데이터 변경내역)를 데이터베이스에 반영할 때 사용하는 명령어다. COMMIT된 트랜잭션의 반영은 되돌릴 수 없으므로 신중하게 사용해야한다.
![]()
트랜잭션을 취소할 때 사용한다. SQL을 수행하는 도중 TCL, DDL, DCL에 해당하는 작업이 없다면 이들은 하나의 트랜잭션에 속해있다. 트랜잭션을 반영하기 전에 ROLLBACK 명령어를 사용하면 트랜잭션에 포함된 데이터 조작 명령어(DML)의 수행을 취소한다.
INSERT INTO DEPT VALUES(50, 'HR', 'BUSAN'); UPDATE DEPT SET LOC = 'SEOUL' WHERE DEPTNO = 10; DELETE FROM DEPT WHERE DEPTNO = 30
![]()
ROLLBACK;
![]()
MySQL을 비롯한 대부분의 관계형 데이터베이스는 기본적으로 Auto-commit 모드가 ON 상태이다.
Auto-commit이 켜져 있으면, SQL문 한 개가 실행될 때마다 자동으로 즉시 COMMIT되어 데이터가 반영된다.
따라서 단일 SQL문을 실행하면 별도의 COMMIT 명령 없이도 바로 결과가 확정된다.
트랜잭션 처리를 하려면 반드시 명시적으로
START TRANSACTION; -- 또는 BEGIN;
을 통해 트랜잭션을 시작해야 하며, 트랜잭션 내에서 여러 명령어를 실행한 후 COMMIT 또는 ROLLBACK으로 결과를 명확히 관리할 수 있다.
Auto-commit 상태에서는 중간에 오류가 발생해도 개별 SQL문은 이미 반영되었기 때문에, 트랜잭션 단위 작업의 원자성을 보장받기 어렵다.
따라서 복잡한 연산이나 일관성 유지를 위해서는 반드시 트랜잭션을 명시적으로 사용해야 한다.
이런 식으로 직접 써봐야 트랜잭션이 어떻게 동작하는지 명확해짐.
Auto-commit개념도 추가하면 좋겠음.MySQL은 기본적으로
Auto-commit=ON이라명령어 하나하나가 자동으로 커밋됨.
트랜잭션 쓰려면
START TRANSACTION으로 명시해야 함.