Materi
Pola baca-ubah-tulis tampak wajar: baca stok ke variabel Python, hitung stok baru, lalu tulis angka itu kembali dengan UPDATE … SET stok = ?. Bila koneksi lain mengubah stok yang sama di antara baca dan tulis, angka yang ditulis berasal dari keadaan lama, dan perubahan koneksi lain itu tertimpa. Inilah pembaruan yang hilang (lost update). Tidak ada galat yang muncul; datanya salah secara diam-diam.
Perbaikannya: biarkan basis data menghitung dari nilai saat pernyataan dijalankan. UPDATE produk SET stok = stok - ? WHERE kode = ? AND stok >= ? membaca, memeriksa, dan menulis dalam satu pernyataan. SQLite hanya mengizinkan satu penulis pada satu waktu — halaman isolasinya menyebut penulisan diserialkan — jadi pernyataan dari dua koneksi berjalan bergiliran dan masing-masing melihat hasil yang lain. Contoh transfer di dokumentasi isolasi PostgreSQL bertumpu pada pola yang sama: balance = balance + 100.
Pola yang sama berlaku untuk periksa-lalu-ubah, misalnya memesan kursi: SELECT untuk melihat apakah kursi kosong, lalu UPDATE untuk mengisinya. Gabungkan keduanya menjadi UPDATE … WHERE pemesan IS NULL, lalu periksa rowcount untuk mengetahui siapa yang menang.
cur = conn.execute(
"UPDATE kamar SET tamu = ? WHERE nomor = ? AND tamu IS NULL",
("Bu Ratna", "204"),
)
berhasil = cur.rowcount == 1