[DB, SQL] 트랜젝션

JUNHO YEOM·2022년 11월 9일
0

DB, SQL

목록 보기
12/21
post-thumbnail

트랜젝션

모든 구문이 성공했을때만 성공
하나라도 실패했을 때는 실패하는것

  • 원자성 (atomicity)
  • 은행 송금 혹은 결제의 경우

원자성을 가져야 하는 이유(나누어 질 수 없는 특징)

A의 계좌에서 돈이 출금되어 B 회사에 결제될 때
1. A에게서 돈이 출금된다.
2. 상품 송장 데이터가 만들어 진다.
3. B 회사에 돈이 입금된다.
1번이 진행되고 난 후에 상품 송장 데이터가 만들어 지지 않아 오류가 발생한 경우
모든 진행된 과정이 취소되어야 DB와 서비스를 안정적으로 유지할 수 있다.


트랜젝션 사용해보기

  • START TRANSACTION 이후 COMMIT까지 완료 되어야 결과가 확정됨
START TRANSACTION;

DELETE FROM sections  # 모든 행을 삭제한다.
WHERE section_id > 0;

SELECT * FROM sections; # 삭제 되었는지 조회

ROLLBACK; # 롤백(되돌림)

SELECT * FROM sections; # 모든 내용이 원상복구됨
# 트랜젝션 실행후 COMMIT 하지 않아서 data를 롤백할 수 있었음

COMMIT

COMMIT 명령을 이용하여 작업을 확정한다

START TRANSACTION;

INSERT INTO sections
(section_name, floor)
VALUES ('동남아', 2);

SELECT * FROM sections;

COMMIT; # 커밋

ROLLBACK;

SELECT * FROM sections;
# 트랜젝션 이후 커밋 하게되면 롤백으로 작업을 되돌릴 수 없음
# 이미 확정되었기 때문

SAVEPOINT

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; # 쿼리 확정
# 인도식이 추가된 상태의 세이브 포인트로 롤백하여
# 남미식을 추가했던 쿼리는 사라졌음.

0개의 댓글