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을 꺼버리고BEGIN과COMMIT을 직접 잡을 수 있어.
결국 대부분 이 두 가지 중 하나로 정착해.
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는 나란히 살아 있어.