Data: Database dan SQL · 6/7
Transaction: semua atau tidak sama sekali
Alat yang mencegah adanya pembayaran yang setengah jadi.
Baca 25 menit
Setelah pelajaran ini kamu bisa
- Membungkus beberapa penulisan dalam sebuah transaction
- Menjelaskan apa yang dijamin rollback
- Mengenali operasi yang membutuhkannya
- Menjelaskan apa itu deadlock dan cara menghindarinya
Transaction mengelompokkan beberapa statement supaya mereka berhasil bersama atau tidak sama sekali. Di antara BEGIN dan COMMIT, tidak ada yang permanen; sebuah ROLLBACK membatalkan semuanya sejak BEGIN.
BEGIN;
UPDATE accounts SET balance = balance - 200000 WHERE id = 1;
UPDATE accounts SET balance = balance + 200000 WHERE id = 2;
COMMIT;
-- or, if anything failed:
ROLLBACK;Contoh klasiknya adalah transfer, dan ia klasik karena kegagalannya sangat jelas. Dijalankan terhadap SQLite proyek ini dengan constraint CHECK (balance >= 0) dan transfer yang lebih besar dari saldonya, hasilnya adalah berikut.
Ana 100000, Budi 50000. Transfer 200000 from Ana to Budi.
WITH a transaction:
first UPDATE fails: CHECK constraint failed: balance >= 0
ROLLBACK
=> Ana 100000, Budi 50000 (unchanged, correct)
WITHOUT a transaction:
first UPDATE fails: CHECK constraint failed: balance >= 0
second UPDATE runs anyway
=> Ana 100000, Budi 250000 (200000 created from nothing)Sebuah transaction, diimplementasikan. Rollback-nya cuma memulihkan snapshot yang diambil saat BEGIN.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Kapan kamu membutuhkannya
- Setiap penulisan multi-tabel yang harus sepakat. Membuat booking dan mengurangi ketersediaan. Keduanya atau tidak sama sekali.
- Baca-lalu-tulis pada data yang sama. Memeriksa sebuah kursi masih kosong, lalu memesannya — transaction mencegah orang lain mengambilnya di sela itu.
- Apa pun yang menyangkut uang. Selalu. Tidak ada kondisi setengah jadi yang bisa diterima.
- Migration. Perubahan skema yang setengah diterapkan sangat sulit dipulihkan — itu sebabnya proyek ini membungkus setiap migration dengan
BEGIN/COMMIT.
Tugas praktik
Baca function migrate di features/db/index.ts. Identifikasi BEGIN, COMMIT, dan ROLLBACK-nya, dan jelaskan dalam satu kalimat apa yang akan terjadi tanpa rollback-nya kalau statement ketiga sebuah migration gagal. Lalu tulis transaction dua statement milikmu sendiri terhadap database latihan dan sengaja buat yang kedua gagal.
Hasil yang diharapkan
Skema yang setengah termigrasi dengan nomor versinya belum maju — tidak bisa dipulihkan tanpa pekerjaan manual.
Cek pemahaman
Pilih jawaban dulu