트랜잭션
- Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법
- BEGIN과 END 혹은 BEGIN과 COMMIT 사이에 해당 SQL들을 사용
- ROLLBACK
두 가지 종류의 트랜잭션이 존재
- AutoCommit False를 쓰면 트랜잭션을 사용할 필요 없으나,
- AutoCommit True일 때는 정합성 문제를 일으킬 수 있는 SQL을 묶어줘야한다.
- 레코드 변경을 바로 반영하는지 여부. autocommit이라는 파라미터로 조절가능
- autocommit=True
- 기본적으로 모든 SQL statement가 바로 커밋됨
- 이를 바꾸고 싶다면 BEGIN;END; 혹은 BEGIN;COMMIT을 사용 (혹은 ROLLBACK)
- autocommit=False
- 기본적으로 모든 SQL statement가 커밋되지 않음
- 커넥션 객체의 .commit()과 .rollback()함수로 커밋할지 말지 결정
- 무엇을 사용할지는 개인, 조직의 취향
- Python의 경우 try/catch와 같이 사용하는 것이 일반적
- try/catch로 에러가 나면 rollback을 명시적으로 실행. 에러가 안 나면 commit을 실행
try:
cur.execute(create_sql)
cur.execute("COMMIT;")
except Exception as e:
cur.execute("ROLLBACK;")
raise
- except에서 raise를 호출하면 발생한 원래 exception이 위로 전파됨
- ETL을 관리하는 입장에서 어떤 에러가 감춰지는 것보다는 명확하게 드러나는 것이 더 좋음
- 위의 경우 cur.execute 뒤에 raise를 호출하는 것이 좋음
try:
cur.execute("BEGIN;")
cur.execute("DELETE FROM keeyong.name_gender;")
cur.execute("INSERT INTO keeyong.name_gender VALUES ('Claire', 'Female');")
cur.execute("END;")
except (Exception, psycopg2.DatabaseError) as error:
print(error)
cur.execute("ROLLBACK;")
raise
finally :
conn.close()
- BEGIN으로 시작해서, 중간에 에러가 생길 경우 END로 끝나지 않고 ROLLBACK
- 그리고 에러가 생겼을 때는 반드시 raise 를 추가해서,
- 에러가 발생하면서 해당 airflow task를 실패시킨다(데이터엔지니어가 명백히 fail인 걸 알아야함)
- except를 쓰더라도, 에러를 알 수 있어야한다.
'데이터 엔지니어링 > 실리콘밸리에서 날아온 데이터엔지니어링 스타터 키트' 카테고리의 다른 글
[4주차] AIRFLOW 활용 데이터 적재(FULL REPRESH) (0) | 2023.05.06 |
---|---|
[4주차] AIRFLOW ubuntu에 설치하기 (0) | 2023.04.30 |
[3주차] AIRFLOW (0) | 2023.04.08 |
[3주차] ETL/데이터파이프라인 (0) | 2023.04.08 |
SQL 윈도우 함수 요약, 예제 (0) | 2023.04.01 |