Lompati ke konten utama
Modul 8 · Pelajaran 4 dari 432/57 dalam kursus~10 min
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

SQL
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 fosse

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

SQL
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

SQL
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:

SQL
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 confermato

ASAM 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 — COMMIT yang berhasil tidak hilang bahkan jika terjadi kerusakan.

Giliranmu

Latihan#sql.m8.l4.e1
Upaya: 0Memuat…

Dalam satu transaksi: kurangi 1 stok produk 1 dan tambah 1 stok produk 2. Buka dengan BEGIN dan tutup dengan COMMIT.

Memuat editor…
Tunjukkan petunjuk

Stok referensi - 1 dan stok + 1 di masing-masing klausa SET.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m8.l4.e2
Upaya: 0Memuat…

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').

Memuat editor…
Tunjukkan petunjuk

ROLLBACK membatalkan setiap perubahan yang dilakukan mulai dari BEGIN dan seterusnya.

Solusi tersedia setelah 3 upaya