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 5 dari 14

BEGIN, COMMIT, dan ROLLBACK di modul sqlite3 Python

commit() dan rollback() di kode Python

Setelah pelajaran ini kamu bisa menulis pola try/except dengan commit() satu kali di akhir dan rollback() di jalur gagal, yang bekerja sama pada koneksi bawaan dan autocommit=False, dan mengenali letak commit() yang merusak atomisitas.

±13 menitDiperiksa 7 Okt 2026

Materi

Pola dasarnya di kode Python: jalankan semua langkah di dalam try; bila ada galat, panggil conn.rollback() lalu lempar ulang galatnya atau ubah menjadi nilai kembali; bila semua langkah selesai, panggil conn.commit() satu kali di akhir. commit() menyimpan semua perubahan yang tertunda, rollback() membatalkannya sampai awal transaksi, dan keduanya tidak berbuat apa pun bila tidak ada transaksi terbuka.

Pola ini bekerja sama pada koneksi isolation_level bawaan dan koneksi autocommit=False. Pada autocommit=False, sqlite3 menjaga satu transaksi selalu terbuka dengan BEGIN DEFERRED, sehingga conn.execute("BEGIN") ditolak dengan cannot start a transaction within a transaction. Langsung kerjakan langkahnya, lalu tutup dengan commit() atau rollback().

def terima_barang(conn, kode, jumlah, nomor_po):
    try:
        conn.execute("UPDATE gudang SET stok = stok + ? WHERE kode = ?", (jumlah, kode))
        conn.execute("UPDATE po SET status = 'diterima' WHERE nomor = ?", (nomor_po,))
    except sqlite3.Error:
        conn.rollback()
        raise
    conn.commit()

Dua letak commit() merusak atomisitas. Yang pertama commit() di antara langkah: separuh pekerjaan tersimpan sebelum langkah berikutnya sempat gagal. Yang kedua commit() di except atau finally: perubahan dari langkah yang sudah berhasil ikut tersimpan walaupun langkah sesudahnya gagal.

Latihan

0/3 lulus

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

Latihan 2 dari 3

Kenapa baris BEGIN ini melempar OperationalError: cannot start a transaction within a transaction?

conn = sqlite3.connect("gudang.db", autocommit=False)
conn.execute("BEGIN")
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke