Materi
Transaksi adalah sekelompok perubahan yang diperlakukan basis data sebagai satu kesatuan. Halaman SQLite tentang transaksi menyebut empat sifatnya dengan singkatan ACID: atomic, consistent, isolated, dan durable. SQLite menegaskan bahwa semua perubahan dalam satu transaksi terjadi seluruhnya atau tidak sama sekali, bahkan bila penulisan ke disk terputus oleh program yang crash, sistem operasi yang crash, atau listrik padam. Tutorial PostgreSQL memakai contoh transfer bank: pengurangan saldo satu rekening dan penambahan saldo rekening lain harus terjadi bersama.
| Sifat | Artinya | Contoh di koperasi |
|---|---|---|
| Atomicity | Semua perubahan dalam transaksi terjadi, atau tidak satu pun | Saldo pengirim tidak berkurang bila saldo penerima gagal ditambah |
| Consistency | Yang tersimpan hanya keadaan yang memenuhi semua constraint | CHECK (saldo >= 0) tidak pernah dilanggar data yang tersimpan |
| Isolation | Perubahan yang belum di-commit tidak terlihat dari koneksi lain | Laporan total saldo tidak melihat transfer yang baru separuh |
| Durability | Sesudah COMMIT berhasil, perubahan tetap ada walau terjadi crash | Setoran yang sudah dikonfirmasi tidak hilang saat listrik padam |
Di SQL, transaksi dibuka dengan BEGIN, disimpan dengan COMMIT, dan dibatalkan dengan ROLLBACK. Tanpa BEGIN, SQLite membungkus setiap pernyataan dalam transaksi otomatisnya sendiri. Koneksi Python yang dibuka dengan isolation_level=None tidak menambahkan perintah apa pun, jadi ketiganya ditulis sendiri lewat conn.execute().
conn.execute("BEGIN")
try:
conn.execute("UPDATE gudang SET stok = stok - 5 WHERE id = 1")
conn.execute("UPDATE gudang SET stok = stok + 5 WHERE id = 2")
except Exception:
conn.execute("ROLLBACK")
raise
conn.execute("COMMIT")
Satu pernyataan juga atomik terhadap dirinya sendiri. Dengan algoritma konflik bawaan ABORT, pernyataan yang melanggar constraint dibatalkan seluruhnya, termasuk baris yang sempat diubahnya, tetapi perubahan dari pernyataan sebelumnya dalam transaksi yang sama tetap ada dan transaksinya tetap terbuka. Jadi galat tidak otomatis membatalkan transaksi; kodemu yang memutuskan ROLLBACK.