터칭 데이터
Redshift - 트랜잭션(Transaction) 본문
트랜잭션(Transaction)
Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법
이는 DDL이나 DML 중 레코드를 수정/추가/삭제한 것에만 의미가 있음.
SELECT에는 트랜잭션을 사용할 이유가 없음
BEGIN과 END 혹은 BEGIN과 COMMIT 사이에 해당 SQL들을 사용
BEGIN과 END(COMMIT)사이의 쿼리가 실패하면 ROLLBACK
은행 계좌 이체가 아주 좋은 예
계좌 이체: 인출과 입금의 두 과정으로 이뤄짐
만일 인출은 성공했는데 입금이 실패한다면?
이 두 과정은 동시에 성공하던지 실패해야함 -> Atomic하다는 의미
이런 과정들을 트랜잭션으로 묶어주어야함
조회만 한다면 이는 트랜잭션으로 묶일 이유가 없음
END와 COMMIT은 동일
만일 BEGIN 전의 상태로 돌아가고 싶다면 ROLLBACK 실행
이 동작은 commit mode에 따라 달라짐!
트랜잭션 커밋 모드: autocommit
autocommit = True
모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 이를 커밋(Commit)된다고 함.
만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN과 END(COMMIT)/ROLLBACK으로 처리
autocommit = False
모든 레코드 수정/삭제/추가 작업이 COMMIT 호출될 때까지 커밋되지 않음
트랜잭션 방식
Google Colab의 트랜잭션
기본적으로 모든 SQL statement가 바로 커밋됨 (autocommit=True)
이를 바꾸고 싶다면 BEGIN;END; 혹은 BEGIN;COMMIT을 사용 (혹은 ROLLBACK;)
psycopg2의 트랜잭션
autocommit이라는 파라미터로 조절가능
autocommit=True가 되면 기본적으로 PostgreSQL의 커밋 모드와 동일
autocommit=False가 되면 커넥션 객체의 .commit()과 .rollback()함수로 트랜잭션 조절 가능
무엇을 사용할지는 개인 취향
DELETE FROM vs. TRUNCATE
DELETE FROM table_name (not DELETE * FROM)
테이블에서 모든 레코드를 삭제
vs. DROP TABLE table_name
WHERE 사용해 특정 레코드만 삭제 가능:
DELETE FROM raw_data.user_session_channel WHERE channel = ‘Google’
DELETE FROM은 테이블은 남기지만 DROP TABLE은 테이블 자체를 삭제합니다.
TRUNCATE table_name도 테이블에서 모든 레코드를 삭제
DELETE FROM은 속도가 느림
TRUNCATE이 전체 테이블의 내용 삭제시에는 여러모로 유리
하지만 두가지 단점이 존재
TRUNCATE는 WHERE을 지원하지 않음
TRUNCATE는 Transaction을 지원하지 않음
DELETE FROM은 트랜잭션 안에서 사용 가능합니다. 하지만 TRUNCATE는 트랜잭션에서 사용해도 ROLLBACK이 불가능합니다.
'SQL' 카테고리의 다른 글
Redshift - 기타 고급 문법 소개와 실습 (0) | 2023.11.16 |
---|---|
Redshift - 복습겸 숙제 (0) | 2023.11.16 |
Redshift - COALESCE, NULLIF, 특수한 필드명 사용방법 (0) | 2023.11.16 |
Redshift - 복습겸 숙제 (0) | 2023.11.16 |
Redshift - BOOLEAN과 NULL 팁 (0) | 2023.11.15 |