Transaksi: Semua Berhasil, atau Tidak Sama Sekali (ACID)
Menjaga data tetap benar saat beberapa perubahan harus berjalan bersama dengan START TRANSACTION, COMMIT, ROLLBACK, dan SAVEPOINT, serta memahami ACID dan isolasi.
Cerita horor: transfer separuh jalan
Budi mentransfer Rp150.000 ke Siti. Di database itu dua perubahan: kurangi saldo Budi, tambah saldo Siti.
UPDATE rekening SET saldo = saldo - 150000 WHERE pemilik = 'Budi'; -- berhasil
-- listrik padam / server crash di sini
UPDATE rekening SET saldo = saldo + 150000 WHERE pemilik = 'Siti'; -- tidak pernah jalan
Uang Budi berkurang, uang Siti tidak bertambah: Rp150.000 lenyap. Kita butuh jaminan bahwa kedua langkah itu berhasil bersama, atau batal bersama. Itulah transaksi.
Perintah transaksi
START TRANSACTION; -- mulai: perubahan setelah ini masih "percobaan"
UPDATE rekening SET saldo = saldo - 150000 WHERE pemilik = 'Budi';
UPDATE rekening SET saldo = saldo + 150000 WHERE pemilik = 'Siti';
COMMIT; -- semua OK: simpan permanen
-- atau:
ROLLBACK; -- ada masalah: batalkan SEMUA, kembali seperti semula
Selama transaksi berjalan, perubahanmu belum permanen dan belum terlihat oleh pengguna lain. Hanya setelah COMMIT semuanya sah.
Menyelamatkan dari salah ketik
START TRANSACTION;
DELETE FROM pelanggan; -- eh, lupa WHERE!
SELECT COUNT(*) FROM pelanggan; -- 0 π±
ROLLBACK; -- selamat! data kembali
SELECT COUNT(*) FROM pelanggan; -- 10
Kebiasaan profesional: sebelum mengubah data produksi secara manual, buka START TRANSACTION, jalankan perubahan, periksa hasilnya dengan SELECT, baru COMMIT. Ragu? ROLLBACK.
Autocommit: kenapa kadang tidak bisa di-undo
Di luar transaksi, MySQL memakai autocommit = 1: setiap perintah langsung COMMIT otomatis. Karena itu DELETE biasa tidak bisa dibatalkan. START TRANSACTION menunda autocommit sampai kamu menutupnya. Perintah DDL seperti CREATE/ALTER/DROP TABLE otomatis meng-COMMIT dan tidak bisa di-rollback.
SAVEPOINT: titik simpan di tengah transaksi
START TRANSACTION;
INSERT INTO pesanan (...) VALUES (...);
SAVEPOINT setelah_pesanan;
INSERT INTO detail_pesanan (...) VALUES (...); -- ternyata salah
ROLLBACK TO setelah_pesanan; -- hanya batalkan langkah terakhir
COMMIT;
ACID: empat janji sebuah transaksi
| Arti | Contoh | |
|---|---|---|
| Atomicity | Semua atau tidak sama sekali | Transfer: kedua UPDATE berhasil bersama atau batal bersama |
| Consistency | Data selalu memenuhi aturan (constraint) | Saldo tidak pernah negatif (CHECK) |
| Isolation | Transaksi yang berjalan bersamaan tidak saling mengacaukan | Dua kasir menjual stok terakhir: tidak terjual dua kali |
| Durability | Yang sudah COMMIT tidak hilang walau server mati | Struk sudah tercetak = data sudah aman |
Hal-hal lanjutan yang perlu kamu dengar
- InnoDB adalah mesin penyimpanan bawaan MySQL yang mendukung transaksi (MyISAM yang tua tidak).
- Level isolasi (READ COMMITTED, REPEATABLE READ [bawaan MySQL], SERIALIZABLE) mengatur seberapa ketat transaksi saling "melihat".
- Locking & deadlock: dua transaksi bisa saling menunggu. MySQL mendeteksinya dan membatalkan salah satu; aplikasi sebaiknya mengulang transaksi itu.
- Jaga transaksi singkat: jangan menunggu input pengguna di tengah transaksi.
- Di aplikasi (Laravel:
DB::transaction(...), PDO:beginTransaction()) konsepnya sama.