Topik ini membuka modul transaksi dengan memaknai empat jaminan ACID sebagai perilaku yang teramati, bukan sekadar istilah. Setiap jaminan disambungkan ke mekanisme PostgreSQL yang menopangnya, dan atomicity didemonstrasikan pada satu sesi agar dapat direkam keluarannya.
Blok penyiapan dataset#
# siapkan ulang tabel dan data contoh untuk topik ini
PGOPTIONS='-c client_min_messages=warning' psql -q -U postgres -d perpustakaan <<'SQL'
DROP TABLE IF EXISTS peminjaman, buku, anggota, kategori CASCADE;
CREATE TABLE kategori (id SERIAL PRIMARY KEY, nama TEXT NOT NULL UNIQUE);
CREATE TABLE anggota (id SERIAL PRIMARY KEY, nama TEXT NOT NULL, email TEXT UNIQUE, bergabung DATE NOT NULL, aktif BOOLEAN NOT NULL DEFAULT TRUE);
CREATE TABLE buku (id SERIAL PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL, tahun INTEGER NOT NULL, kategori_id INTEGER REFERENCES kategori(id));
CREATE TABLE peminjaman (id SERIAL PRIMARY KEY, anggota_id INTEGER NOT NULL REFERENCES anggota(id), buku_id INTEGER NOT NULL REFERENCES buku(id), tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE);
INSERT INTO kategori (nama) VALUES ('Pemrograman'), ('Sains'), ('Sejarah'), ('Fiksi'), ('Statistika');
INSERT INTO anggota (nama, email, bergabung, aktif) VALUES ('Ali Rahman', '[email protected]', '2024-01-15', TRUE), ('Budi Santoso', '[email protected]', '2024-03-02', TRUE), ('Citra Kirana', '[email protected]', '2024-05-20', FALSE), ('Dewi Lestari', '[email protected]', '2024-08-11', TRUE), ('Eka Pratama', NULL, '2025-01-30', TRUE);
INSERT INTO buku (judul, penulis, tahun, kategori_id) VALUES ('Dasar Basis Data', 'Sari Wulandari', 2021, 1), ('Jaringan Komputer', 'Ahmad Fauzi', 2019, 1), ('Fisika untuk Pemula', 'Rina Marlina', 2020, 2), ('Kimia Organik', 'Rina Marlina', 2022, 2), ('Sejarah Nusantara', 'Bambang Wijaya', 2018, 3), ('Cerita Kota Lama', 'Nur Aisyah', 2023, 4), ('Statistika Terapan', 'Sari Wulandari', 2022, 5), ('Algoritma dan Struktur Data', 'Ahmad Fauzi', 2021, 1);
INSERT INTO peminjaman (anggota_id, buku_id, tanggal_pinjam, tanggal_kembali) VALUES (1, 1, '2025-03-01', '2025-03-15'), (1, 7, '2025-03-05', '2025-03-20'), (2, 3, '2025-03-10', NULL), (3, 5, '2025-02-20', '2025-03-01'), (2, 1, '2025-04-02', NULL), (4, 6, '2025-04-07', NULL), (5, 8, '2025-04-09', '2025-04-25'), (4, 2, '2025-05-01', NULL);
SQLAtomicity dalam satu unit#
Atomicity berarti seluruh pernyataan dalam transaksi terjadi atau tidak sama sekali, dan kegagalan di tengah jalan membatalkan semuanya. Blok berikut membuka transaksi, menyisipkan satu baris sah, lalu menyisipkan baris yang melanggar keunikan email, dan COMMIT-nya atas transaksi yang batal berubah menjadi pembatalan.
# kegagalan satu pernyataan membatalkan seluruh transaksi
psql -U postgres -d perpustakaan <<'SQL'
BEGIN;
INSERT INTO anggota (nama, email, bergabung) VALUES ('Farah Nabila', '[email protected]', '2025-06-01');
INSERT INTO anggota (nama, email, bergabung) VALUES ('Duplikat', '[email protected]', '2025-06-02');
COMMIT;
SELECT COUNT(*) AS farah FROM anggota WHERE nama = 'Farah Nabila';
SQLBEGIN
INSERT 0 1
ERROR: duplicate key value violates unique constraint "anggota_email_key"
DETAIL: Key (email)=([email protected]) already exists.
ROLLBACK
farah
-------
0
(1 row)Baris sah yang sudah masuk ikut dibatalkan ketika transaksinya batal, dan COUNT menegaskan tidak ada yang tertinggal. Pesan pada COMMIT atas transaksi yang batal adalah ROLLBACK, perilaku yang menegaskan bahwa status batal menular ke seluruh unit kerjanya.
Consistency sebagai pagar aturan#
Consistency berarti setiap transaksi membawa basis data dari keadaan sah ke keadaan sah berikutnya, dan penegaknya adalah constraint yang dibahas pada modul definisi data. Server tidak memahami aturan bisnis, tetapi ia menegakkan setiap aturan yang dideklarasikan, sehingga konsistensi yang dimaksud adalah konsistensi terhadap skema.
Pemilihan desain yang menyertai adalah menaruh aturan yang mendasar ke constraint, bukan hanya ke aplikasi, karena transaksi dari skrip pemeliharaan dan alat lain tunduk pada constraint yang sama. Pelanggaran yang ditolak pada contoh di atas adalah bentuknya yang paling terlihat, sedangkan CHECK dan foreign key menegakkan bentuk yang lebih kaya.
Isolation dan durability#
Isolation berarti transaksi yang berjalan bersamaan tidak saling mencemari, dan PostgreSQL menopangnya dengan MVCC, yaitu multi-version concurrency control yang menyimpan beberapa versi baris sehingga pembaca tidak menunggu penulis dan sebaliknya. Setiap transaksi membaca potret data pada saat menilai barisnya, dan tingkat ketatnya diatur isolation level yang menjadi topik penuh di modul ini.
Durability berarti perubahan yang di-COMMIT bertahan melintasi kegagalan server, dan penopangnya adalah write-ahead log yang menulis catatan perubahan ke disk sebelum COMMIT dinyatakan berhasil. Kedua jaminan ini bekerja tanpa disentuh pembaca, sedangkan dua jaminan pertama terasa langsung pada setiap blok transaksi yang ditulis.
Kesalahan umum#
Kesalahan pertama adalah mengira kegagalan di tengah transaksi meninggalkan sebagian perubahan, padahal status batal membatalkan seluruh unit, dan pemisahan yang disengaja membutuhkan transaksi terpisah atau SAVEPOINT pada topik tersendiri. Kesalahan kedua adalah transaksi yang panjang menahan versi lama baris dari dibersihkan, yang menumpuk baris mati dan membengkakkan tabel, kebiasaan yang diwaspadai sejak desain unit kerja.
Kesalahan ketiga adalah mengira DDL tidak dapat dibatalkan, padahal PostgreSQL menjalankannya dalam transaksi sebagaimana dibuktikan pada modul definisi data. Kesalahan keempat adalah mematikan durability demi kecepatan pada lingkungan penting tanpa memahami konsekuensinya, karena jendela kehilangan COMMIT terakhir muncul tepat saat gagal daya terjadi.
Satu kebiasaan aplikasi yang melengkapi keempat jaminan adalah idempotensi di sisi klien, yaitu menyertakan penanda usaha (attempt) pada transaksi yang mungkin diulang, sehingga pengulangan yang terjadi setelah kehilangan jawaban COMMIT tidak menciptakan dobel. Server menegakkan keunikan penandanya melalui constraint biasa, dan penolakan duplikat menjadi tanda usaha yang sama sudah sukses. Jaminan server dan kebiasaan klien berpasangan pada titik yang paling sering ditanyakan pemilik sistem, yaitu apa yang terjadi ketika jaringan putus tepat sesudah COMMIT.
Ringkasan#
- Atomicity menjadikan transaksi sebagai unit yang utuh, dan COMMIT atas transaksi batal berubah menjadi ROLLBACK.
- Consistency ditegakkan constraint di tingkat basis data, sehingga setiap jalur penulisan tunduk pada aturan yang sama.
- Isolation ditopang MVCC yang menyimpan versi baris, dan tingkat ketatnya diatur isolation level.
- Durability bertumpu pada write-ahead log yang menulis sebelum COMMIT dinyatakan berhasil.
Referensi#
- Concurrency Control — PostgreSQL Documentation — Bab resmi tentang MVCC dan jaminan transaksi.
- Transactions — PostgreSQL Tutorial — Pengantar transaksi pada tutorial resmi.
- Reliability and the Write-Ahead Log — PostgreSQL Documentation — Mekanisme WAL yang menopang durability.