Materi
BEGIN…COMMIT tidak bisa bersarang, tetapi savepoint bisa. SAVEPOINT nama menaruh tanda di linimasa transaksi. ROLLBACK TO nama membatalkan semua perubahan sesudah tanda itu; tandanya tetap di tumpukan dan transaksinya tetap terbuka, jadi pekerjaan bisa dilanjutkan. RELEASE nama menghapus tanda itu beserta tanda yang dibuat sesudahnya, dan menggabungkan perubahannya ke transaksi induk. Halaman SQLite menggambarkannya persis begitu: SAVEPOINT membuat tanda, ROLLBACK TO memutar balik ke tanda itu, RELEASE menghapus tanda tanpa mengubah isi basis data.
Aturan tumpukannya: COMMIT menyimpan semua dan mengosongkan tumpukan; ROLLBACK tanpa TO membatalkan semua; nama yang tidak ada di tumpukan membuat ROLLBACK TO atau RELEASE gagal tanpa mengubah apa pun. Savepoint yang dibuka tanpa BEGIN memulai transaksinya sendiri, dan RELEASE atas savepoint terluar itu meng-commit. Di dalam BEGIN, RELEASE belum menyimpan apa pun ke disk: ROLLBACK di transaksi luar tetap membatalkannya.
conn.execute("BEGIN")
for nomor, nilai in setoran:
conn.execute("SAVEPOINT baris")
try:
conn.execute("INSERT INTO kas(nomor, nilai) VALUES (?, ?)", (nomor, nilai))
conn.execute("RELEASE baris")
except sqlite3.IntegrityError:
conn.execute("ROLLBACK TO baris") # hanya baris ini yang batal
conn.execute("RELEASE baris")
conn.execute("COMMIT")