Pelajaran modul (1/4)
Transaksi ACID (BEGIN/COMMIT)
Fondasi keandalan database apa pun terletak pada akronim ACID:
- Atomicity: suatu operasi selesai seluruhnya (Commit), atau gagal tanpa meninggalkan jejak yang setengah selesai (Rollback).
- Ckonsistensi: aturan database (misalnya batasan, Kunci Asing) selalu dipatuhi.
- Isolation: transaksi yang terjadi pada saat yang sama tidak mengganggu satu sama lain dengan cara yang tidak terkendali.
- Ketahanan: setelah Komit, perubahan ditulis ke disk secara permanen.
Sintaks transaksi
Biasanya setiap kueri UPDATE atau DELETE diperlakukan sebagai transaksi mandiri (komit otomatis). Namun bila Anda ingin mengelompokkan beberapa operasi bersama-sama, misalnya mendebit rekening pelanggan dan melakukan pemesanan, Anda harus melakukannya secara eksplisit menggunakan sintaks transaksi.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesJika selama eksekusi kompleks ini aplikasi JavaScript yang mengirimkan kueri menyadari ada masalah (misalnya tidak ada cukup stok di gudang dan crash), aplikasi tersebut akan mengirimkan:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockCobalah sendiri
Buka transaksi.\nPerbarui produk dengan ID 10 dengan menyetel 'kuantitas' ke 0 di tabel sementara (jangan tunggu, 'kuantitas' tidak ada pada produk, mari kita ciptakan: ubah 'unit_price' di 'order_items' tetapi hal ini memerlukan batasan.\nMari kita lakukan yang lebih baik: Perbarui status ID pesanan 5 menjadi 'dikirim' dan berhasil menyelesaikan transaksi.
Tunjukkan petunjuk
Mulailah dengan BEGIN;, ubah pesanan untuk id = 5 menjadi status='shipped', lalu kirimkan dengan COMMIT;
Solusi tersedia setelah 3 upaya
Panik dalam produksi! Seorang pengembang menulis DELETE tanpa WHERE, yang secara historis menghapus semua ulasan.\nMari kita tunjukkan kepada mereka bagaimana rollback dilakukan. Mulai transaksi, jalankan DELETE cepat yang menghapus semuanya dari 'ulasan' (tanpa klausa WHERE), tetapi kemudian gunakan penyelamat SQL untuk membatalkan dampak sebelum menyelesaikan pemblokiran.
Tunjukkan petunjuk
BEGIN;, penghapusan bersih pada 'ulasan', dan kemudian ROLLBACK ajaib; di akhir.
Solusi tersedia setelah 3 upaya