Apa itu Transaction?
Transaction adalah sekelompok operasi database yang dijalankan sebagai satu unit. Semua berhasil, atau semua dibatalkan (all-or-nothing).
ACID Properties
- Atomicity — semua operasi berhasil atau semua gagal
- Consistency — database selalu dalam state yang valid
- Isolation — transaction yang berjalan bersamaan tidak saling mengganggu
- Durability — setelah commit, data tersimpan permanen
-- Contoh transfer uang: harus atomic
BEGIN;
UPDATE accounts SET balance = balance - 500000 WHERE id = 1;
UPDATE accounts SET balance = balance + 500000 WHERE id = 2;
COMMIT;
-- Jika salah satu gagal: ROLLBACK, tidak ada uang hilang
-- Dengan error handling
BEGIN;
UPDATE accounts SET balance = balance - 500000 WHERE id = 1;
-- Cek saldo cukup
IF (SELECT balance FROM accounts WHERE id = 1) < 0 THEN
ROLLBACK;
END IF;
UPDATE accounts SET balance = balance + 500000 WHERE id = 2;
COMMIT;
Isolation Levels
Isolation level menentukan seberapa ketat isolasi antar transaction yang berjalan bersamaan.
1. Read Uncommitted
Bisa baca data dari transaction lain yang belum commit (dirty read). Jarang digunakan.
2. Read Committed (Default PostgreSQL)
Hanya baca data yang sudah di-commit. Aman dari dirty read, tapi bisa terjadi non-repeatable read.
3. Repeatable Read
Data yang dibaca dalam satu transaction konsisten. Aman dari non-repeatable read.
4. Serializable
Isolasi tertinggi. Transaction berjalan seolah-olah sequential. Paling aman tapi paling lambat.
-- Set isolation level
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT balance FROM accounts WHERE id = 1;
-- ...
COMMIT;
Di Laravel
// Basic transaction
DB::transaction(function () {
DB::table('accounts')->where('id', 1)->decrement('balance', 500000);
DB::table('accounts')->where('id', 2)->increment('balance', 500000);
});
// Manual transaction
DB::beginTransaction();
try {
// ... operations
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}