Materi
SQLite mengizinkan banyak transaksi baca dari koneksi berbeda, tetapi hanya satu transaksi tulis pada satu waktu. Kapan sebuah transaksi menjadi transaksi tulis ditentukan kata setelah BEGIN. DEFERRED, nilai bawaan, belum mengambil apa pun sampai basis data pertama kali diakses: SELECT pertama memulai transaksi baca, dan pernyataan tulis pertama mencoba meningkatkannya menjadi transaksi tulis. Peningkatan itu gagal dengan SQLITE_BUSY bila koneksi lain sudah sedang menulis.
IMMEDIATE langsung memulai transaksi tulis saat BEGIN, sehingga bila ada penulis lain, kegagalannya muncul di BEGIN, sebelum satu pun pernyataanmu berjalan. EXCLUSIVE sama dengan IMMEDIATE di mode WAL; di mode journal lain, ia juga menolak pembaca dari koneksi lain selama transaksi berlangsung. Di mode rollback bawaan, COMMIT tetap bisa menunggu pembaca yang masih aktif melepas kuncinya.
Di Python, SQLITE_BUSY muncul sebagai sqlite3.OperationalError dengan pesan database is locked. Parameter timeout pada sqlite3.connect() menentukan berapa detik koneksi menunggu sebelum melempar galat itu; bawaannya lima detik. Latihan di sini memakai timeout=0 supaya galatnya langsung terlihat.
try:
conn.execute("BEGIN IMMEDIATE")
except sqlite3.OperationalError:
print("Basis data sedang dipakai penulis lain; coba lagi nanti")
else:
... # kerjakan, lalu COMMIT atau ROLLBACK