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.

Part 34 dari 38 Β± 50 menit Gratis

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

ArtiContoh
AtomicitySemua atau tidak sama sekaliTransfer: kedua UPDATE berhasil bersama atau batal bersama
ConsistencyData selalu memenuhi aturan (constraint)Saldo tidak pernah negatif (CHECK)
IsolationTransaksi yang berjalan bersamaan tidak saling mengacaukanDua kasir menjual stok terakhir: tidak terjual dua kali
DurabilityYang sudah COMMIT tidak hilang walau server matiStruk 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X