Memahami isolation level transaksi database
Pelajari perbedaan Read Committed dan Repeatable Read serta dampaknya pada data yang dibaca bersamaan.
Masalah yang muncul saat transaksi berjalan bersamaan
Ketika dua transaksi berjalan pada waktu yang sama, salah satu bisa membaca data yang sedang diubah transaksi lain. Isolation level menentukan seberapa besar transaksi lain boleh saling memengaruhi hasil bacanya.
Read Committed
Level ini hanya mengizinkan transaksi membaca data yang sudah di-commit. Ini adalah default di banyak basis data seperti PostgreSQL dan SQL Server.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT saldo FROM rekening WHERE id = 1;
-- transaksi lain bisa mengubah dan commit di antara dua SELECT ini
SELECT saldo FROM rekening WHERE id = 1;
COMMIT;
Dua SELECT di atas bisa menghasilkan nilai berbeda karena transaksi lain sempat commit di antaranya. Kondisi ini disebut non-repeatable read.
Repeatable Read
Level ini menjamin baris yang sudah dibaca tidak berubah nilainya selama transaksi berjalan. MySQL dengan InnoDB memakai level ini sebagai default.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Repeatable Read tetap bisa mengalami phantom read, yaitu baris baru muncul saat query dengan kondisi yang sama diulang.
Serializable
Level paling ketat ini membuat transaksi seolah berjalan satu per satu secara berurutan. Konsistensi paling terjamin, tetapi risiko transaksi harus diulang karena konflik juga meningkat.
Memilih level yang tepat
Level yang lebih ketat memberi konsistensi lebih tinggi tapi mengurangi konkurensi. Gunakan Read Committed untuk kebanyakan operasi harian, dan naikkan ke level lebih ketat hanya pada operasi yang benar-benar sensitif terhadap keakuratan data, seperti perhitungan saldo.
Latihan
Coba jalankan dua transaksi di jendela terpisah menggunakan Read Committed lalu Repeatable Read, dan amati kapan masing-masing melihat perubahan dari transaksi lain.
