Pelajaran modul (4/4)
Transaksi: semua atau tidak sama sekali
transaksi adalah sekelompok operasi yang diperlakukan sebagai database
satu unit: semuanya berhasil, atau tidak ada yang keluar dari a
jejak. Begitulah cara Anda melindungi diri Anda dari ketidakkonsistenan saat berurutan
dari UPDATE/INSERT/DELETE harus tetap konsisten.
Sintaksnya
BEGIN; -- apri la transazione
UPDATE …;
INSERT …;
DELETE …;
SELECT …; -- puoi anche solo leggere
COMMIT; -- conferma tutte le modifiche
-- oppure
ROLLBACK; -- annulla tutte le modifiche, come se nulla fosseSegala sesuatu di antara BEGIN dan COMMIT bersifat atomik: tidak ada koneksi lain
melihat keadaan peralihan. Jika program crash atau dijalankan
ROLLBACK, database tetap sama seperti sebelum BEGIN.
Skenario klasiknya: transfer
Contoh kanoniknya adalah transfer saham antar produk (atau uang
transfer antar rekening): dua UPDATE yang harus berhasil bersama,
tidak pernah satu ya dan satu lagi tidak.
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;Jika UPDATE kedua gagal (misalnya kesalahan batasan CHECK), a
ROLLBACK mengembalikan stok produk 1 ke nilai aslinya.
ROLLBACK: debugger DBA
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1; -- "vedo come è cambiato"
ROLLBACK;Pola yang sangat berguna untuk mencoba UPDATE pada data nyata: Anda
jalankan, periksa hasilnya dengan SELECT di transaksi yang sama, dan
jika tidak meyakinkan Anda, Anda ROLLBACK — databasenya persis seperti
itu sebelumnya.
SAVEPOINT: pengembalian sebagian
Di dalam transaksi Anda dapat membuat titik perantara:
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT; -- solo il primo UPDATE viene confermatoASAM dalam 30 detik
Transaksi menjamin properti ACID:
- Atomicity — semua atau tidak sama sekali;
- Ckonsistensi — batasan tetap terpenuhi pada awal dan akhir transaksi;
- Isolation — transaksi bersamaan tidak melihat status perantara (di berbagai "level");
- Durabilitas —
COMMITyang berhasil tidak hilang bahkan jika terjadi kerusakan.
Giliranmu
Dalam satu transaksi: kurangi 1 stok produk 1 dan tambah 1 stok produk 2. Buka dengan BEGIN dan tutup dengan COMMIT.
Tunjukkan petunjuk
Stok referensi - 1 dan stok + 1 di masing-masing klausa SET.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Buka transaksi, coba perbarui kota pelanggan dengan id=1 ke 'Sperimentale', lalu batalkan operasi dengan ROLLBACK. Pada akhirnya kota pelanggan 1 harus menjadi kota asli ('Milano').
Tunjukkan petunjuk
ROLLBACK membatalkan setiap perubahan yang dilakukan mulai dari BEGIN dan seterusnya.
Solusi tersedia setelah 3 upaya