티스토리 뷰
트랜잭션
- 테이블의 내용을 변경하는 SQL들이 연달아 실행되며 이것들이 마치 하나의 SQL처럼 모두 성공하거나, 하나라도 실패하면 모두 실패하는 등의 동작이 필요하면 트랜잭션을 사용해야 한다.
- 원자성을 만족하는 것을 말한다.
- DDL이나 DML중 INSERT/UPDATE/DELETE에 의미가 있다.
- SELECT는 조회만 하기 때문에 트랜잭션을 사용할 이유가 없다.
- BEGIN과 END, BEGIN과 COMMIT 사이에 해당 SQL들을 사용한다.
- ROLLBACK을 통해 트랜잭션 실행중 에러가 발생하면 트랜잭션 시작 전 상태로 되돌린다.
예시
- 계좌 이체 : A가 B에게 송금한다.
- 계좌 이체는 출금만 성공하고 입금이 실패하면 안 된다.
- 두 개의 트랜잭션이 하나처럼 동작을 해야 한다. -> Atomic하다.
- 조회만 하는 경우이면 트랜잭션으로 묶을 이유가 없다.
- 데이터가 변하지 않기 때문에 조회 중간에 실패하더라도 데이터의 정합성에는 문제가 없다.
-
BEGIN; -- START TRANSACTION A의 계좌에서 인출; B의 계좌로 입금; END; -- COMMIT
- BEGIN과 START TRANSACTION은 같은 의미이다.
END와 COMMIT은 같은 의미이다. - BEGIN 전의 상태로 돌아가고 싶으면 ROLLBACK을 실행한다.
- 트랜잭션 동작은 autocommit 모드에 따라 달라진다.
트랜잭션 커밋 모드
autocommit = True
- 모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여진다. 이를 커밋된다고 한다.
- autocommit이 True인 경우에만 트랜잭션을 사용할 수 있다.
- 만약 특정 작업을 트랜잭션으로 묶고 싶으면 BEGIN(START TRANSACTION) END(COMMIT)/ROLLBACK 으로 처리한다.
- 트랜잭션이 진행중이라도 다른 사람들은 트랜잭션 시작 전 상태를 보게 된다.
-
BEGIN; DELETE FROM 테이블; INSERT INTO 테이블 VALUES (값1, 값2); ROLLBACCK;
autocommit = False
- 모든 레코드 수정/삭제/추가 작업이 COMMIT이 호출될 때까지 커밋되지 않는다.
- 모든 것이 명시적으로 커밋/롤백을 해야 반영되기 때문에 트랜잭션의 개념이 없다
- 즉 명시적으로 커밋을 해야한다.
- ROLLBACK이 호출되면 앞에 했던 작업들이 무시된다.
728x90
반응형
'프로그래머스 백엔드 1기 > Database' 카테고리의 다른 글
데이터베이스 (16) - 성능 튜닝 Explain SQL, index 튜닝 (0) | 2021.08.14 |
---|---|
데이터베이스 (14) - View (0) | 2021.08.14 |
데이터베이스 (12) - JOIN (0) | 2021.08.13 |
데이터베이스 (11) - INSERT문, UPDATE문, DELETE문 (0) | 2021.08.12 |
데이터베이스 (10) - SELECT문 (0) | 2021.08.12 |
댓글