모든 구문이 성공했을때만 성공
하나라도 실패했을 때는 실패하는것
원자성을 가져야 하는 이유(나누어 질 수 없는 특징)
A의 계좌에서 돈이 출금되어 B 회사에 결제될 때
1. A에게서 돈이 출금된다.
2. 상품 송장 데이터가 만들어 진다.
3. B 회사에 돈이 입금된다.
1번이 진행되고 난 후에 상품 송장 데이터가 만들어 지지 않아 오류가 발생한 경우
모든 진행된 과정이 취소되어야 DB와 서비스를 안정적으로 유지할 수 있다.
START TRANSACTION;
DELETE FROM sections # 모든 행을 삭제한다.
WHERE section_id > 0;
SELECT * FROM sections; # 삭제 되었는지 조회
ROLLBACK; # 롤백(되돌림)
SELECT * FROM sections; # 모든 내용이 원상복구됨
# 트랜젝션 실행후 COMMIT 하지 않아서 data를 롤백할 수 있었음
COMMIT 명령을 이용하여 작업을 확정한다
START TRANSACTION;
INSERT INTO sections
(section_name, floor)
VALUES ('동남아', 2);
SELECT * FROM sections;
COMMIT; # 커밋
ROLLBACK;
SELECT * FROM sections;
# 트랜젝션 이후 커밋 하게되면 롤백으로 작업을 되돌릴 수 없음
# 이미 확정되었기 때문
SAVEPOINT명령을 사용하여 롤백할 중간지점을 저장한다.
START TRANSACTION;
INSERT INTO sections # 인도식이라는 데이터 추가
(section_name, floor)
VALUES ('인도식', 2);
SAVEPOINT indian; # 세이브 포인트 생성
INSERT INTO sections # 남미식이라는 데이터 추가
(section_name, floor)
VALUES ('남미식', 3);
SELECT * FROM sections;
ROLLBACK TO indian; # indian 이름의 세이브 포인트로 롤백
SELECT * FROM sections;
COMMIT; # 쿼리 확정
# 인도식이 추가된 상태의 세이브 포인트로 롤백하여
# 남미식을 추가했던 쿼리는 사라졌음.