Lompat ke konten utama

Kompetisi Ajak Teman: hadiah total Rp1.000.000 tunai untuk 3 pengajak terbanyak. Berakhir 29 November 2026. Ikut kompetisi

←

Transaksi Basis Data: Menjaga Data Tetap Konsisten

Pelajaran 12 dari 14

Akses bersamaan dan pengantar isolasi

Kunci SQLite: BEGIN DEFERRED, IMMEDIATE, dan EXCLUSIVE

Setelah pelajaran ini kamu bisa menjelaskan kapan transaksi SQLite mengambil kunci tulis, memilih BEGIN IMMEDIATE untuk transaksi yang membaca lalu menulis, dan menangani galat database is locked tanpa meninggalkan transaksi terbuka.

±13 menitDiperiksa 7 Okt 2026

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

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 3

Dua koneksi ke berkas yang sama dibuka dengan isolation_level=None dan timeout=0. Apa yang terjadi?

a.execute("BEGIN IMMEDIATE")
b.execute("BEGIN IMMEDIATE")
Pilih satu jawaban

Latihan 3 dari 3

Basis data memakai mode journal rollback bawaan (bukan WAL). Koneksi A sedang menjalankan transaksi panjang. Apa beda bagi koneksi B yang hanya ingin membaca, bila A memakai BEGIN IMMEDIATE dibanding BEGIN EXCLUSIVE?

Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke