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.