본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

Python의 Transaction — Implicit 모델

~14 min · python, transactions, isolation_level

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Python sqlite3에서 제일 놀라는 부분

Python sqlite3 모듈은 SQLite 위에 자기만의 암묵적 transaction 동작을 얹어놨어. 기본값이 사람들을 자주 놀래키지.

  • 기본적으로 첫 DML statement(INSERT, UPDATE, DELETE) 앞에서 transaction을 알아서 열어.
  • DML이 아닌 statement(CREATE TABLE 같은) 앞에서는 알아서 commit해버려. 그 유명한 'PRAGMA를 transaction 안에서 돌렸는데' 버그가 여기서 나와.
  • 이 동작을 isolation_level 속성이 쥐고 있어. conn.isolation_level = None으로 암묵적 transaction을 꺼버리고 BEGINCOMMIT을 직접 잡을 수 있어.

결국 대부분 이 두 가지 중 하나로 정착해.

  • with conn:을 쓰는 방식. context manager가 들어갈 때 BEGIN하고, 잘 끝나면 COMMIT하고, 예외가 나면 ROLLBACK해.
  • isolation_level = None을 걸고 conn.execute('BEGIN IMMEDIATE')를 직접 부르는 방식.
Warning: Python 3.12가 오래된 isolation_level보다 뜻이 분명한 autocommit 속성을 새로 넣었어. 새 코드라면 명시적으로 transaction을 잡을 때 autocommit=False를, autocommit 스타일로 갈 때 autocommit=True를 써. 옛 코드는 여전히 isolation_level을 쓰고, 두 API는 나란히 살아 있어.

Code

with conn — 일상 패턴·python
import sqlite3

conn = sqlite3.connect('demo.db')

with conn:
    conn.execute('INSERT INTO users(email) VALUES (?)', ('a@x.com',))
    conn.execute('INSERT INTO users(email) VALUES (?)', ('b@x.com',))
    # 여기서 exception = ROLLBACK; 깨끗 종료 = COMMIT.
명시적 transaction 제어·python
import sqlite3

conn = sqlite3.connect('demo.db', isolation_level=None)  # autocommit-ish

conn.execute('BEGIN IMMEDIATE')
try:
    conn.execute('INSERT INTO orders(...) VALUES (...)')
    conn.execute('UPDATE inventory SET qty = qty - 1 WHERE id = ?', (sku,))
    conn.execute('COMMIT')
except Exception:
    conn.execute('ROLLBACK')
    raise

External links

Exercise

Python의 transaction 동작을 세 가지로 재현해봐. with conn:의 암묵적 transaction, isolation_level = None을 건 명시적 transaction, 그리고 열린 transaction 안에서 PRAGMA를 돌리면 그게 commit돼버리는 버그. 각각 동작이 드러나는 짧은 테스트를 붙이고, 네 코드에는 어떤 패턴을 쓸지 정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.