원자적 작업 묶음
Transaction은 여러 statement를 원자 단위 하나로 묶는 거야. 전부 적용되거나 하나도 안 되거나 둘 중 하나지. SQLite는 기본이 완전한 ACID야. statement 하나짜리도 암묵적인 transaction 안에서 돌아.
명시적으로 쓰는 모양은 셋이야.
BEGIN; ... COMMIT;— transaction을 열고 잘 끝나면 확정해.BEGIN; ... ROLLBACK;— BEGIN 이후의 변경을 전부 없던 일로 해.- SAVEPOINT — 바깥 transaction 안에 중간 지점을 찍어둬. 잘 끝나면
RELEASE, 잘못되면ROLLBACK TO로 그 지점까지만 되돌려.
transaction 모드도 셋 있어.
- DEFERRED — 기본값이야. 필요해지는 순간에 락을 잡아.
- IMMEDIATE — BEGIN 하는 순간 write 락을 잡아서 다른 writer를 바로 세워.
- EXCLUSIVE — 배타 락을 잡아서 다른 reader와 writer를 전부 세워.
Tip: 다른 writer와 부딪힐 수 있는 '전부 아니면 전무' 작업이라면
BEGIN IMMEDIATE를 써. 기본인 DEFERRED는 다른 writer가 먼저 도착했을 때 COMMIT 시점에 SQLITE_BUSY로 터질 수 있는데, IMMEDIATE는 BEGIN에서 일찍 실패해줘.