Lompat ke konten
Kembali ke modul

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.

sql
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.

text
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)
Keduanya output nyata yang sudah diverifikasi. Yang kedua menciptakan uang — dan tidak ada error pada penulisan yang penting itu.
Coba sendiri

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

Sebuah transfer mendebit satu akun dan mengkredit yang lain. Debitnya gagal karena constraint CHECK. Tanpa transaction, apa yang terjadi?

Pilih jawaban dulu