DB의 상태를 변화시키기 위해 수행하는 하나의 논리적인 작업 단위
위의 트랜잭션 예시를 다시 보자.
SELECT
UPDATE
CREATE
5번까지 모두 성공한다면, 출금 정보를 모두 반영 (= commit)하지만
4번에서 오류가 발생했다면, 앞의 작업을 모두 원래대로 복원(= rollback)해야한다. 하나의 작업을 처리하기 위해 여러 SQL문들을 실행하던 도중 중간에 문제가 발생할 경우, 그 전에 실행되었던 SQL문들을 취소해야만 하는 것이다.
정리하자면 하나의 원자 트랜잭션은 모두 성공(= commit)하거나 실패(= rollback)하는 SQL문들의 집합이다.
즉, 트랜잭션은 rollback되거나 commit되어야하는 것이 원자성이다.
트랜잭션이 진행되는 동안에 데이터가 변경되더라도 업데이트된 데이터로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행 하기 위해 참조한 데이터로 진행되어야 함
둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우, 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산을 끼어들 수 없음
트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 함
DDL
이나 DML
에서 테이블이나 레코드를 추가/수정/삭제할 때만 사용SELECT
를 사용할 때는 트랜잭션이 굳이 필요 없음BEGIN; -- = START TRANSACTION; , 자동 commit이 수동 commit으로 변경됨
-- SQL문들
-- ROLLBACK 명령어를 작성하면 이전 SQL문들의 실행을 취소하고, BEGIN 이전 상태로 돌아감
END; -- = COMMIT; , 변경 사항들을 DB에 반영