Mengenal ACID Transactions
Pernah gak kamu mengirim uang ke temen, terus ada gangguan di banknya. Tau tau saldo kepotong tapi duitnya ga masuk?
Kira kira kemana perginya duit tadi? Apakah ditilap tuyul? Tentu tidak kawan.
Nah disinilah ACID berperan. ACID singkatan dari Atomicity, Consistency, Isolation and Durability Prinsip dasar yang harus dimiliki agar transaksi yang terjadi didatabase dapat diproses dengan aman dan data nggak kacau balau.
![Mengenal ACID Transactions](/_next/image?url=%2F_next%2Fstatic%2Fmedia%2FACID-transactions.308346d7.jpg&w=3840&q=75)
Kita akan membahas apa itu ACID, penerapannya dan apa pentingnya ACID pada database. Mari kita bahas satu per satu:
Atomicity
Atomicity memastikan bahwa transaksi di eksekusi seluruhnya. Apabila terjadi error ditengah kode atau koneksi error, maka transaksi akan dirollback kembali. Contohnya dalam kirim dana, kita akan mengurangi saldo temen kamu dan menambah saldo kamu. Example:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
π Tanpa Atomicity: Saldo kamu berkurang Rp100.000, tapi temanmu nggak dapat uangnya.
Jadi ketika kode kedua gagal dilakukan maka database tidak akan melakukan commit transaksi, sehingga tidak ada data yang disimpan. Sebaliknya apabila semua query berhasil dilakukan maka database akan menyimpan semua perubahan. Either All or none of them.
Consistency
Consistency menjamin bahwa setelah transaksi selesai, data dalam database tetap konsisten dan sesuai dengan aturan yang telah ditentukan. Misalnya ada aturan dalam database:
- Saldo rekening tidak boleh negatif.
Kamu punya saldo Rp50.000, lalu coba transfer Rp100.000. Karena nggak memenuhi aturan (saldo jadi negatif), transaksi akan langsung gagal. Consistency memastikan data selalu valid sesuai aturan yang sudah ditentukan.
π Tanpa Consistency: Kamu bisa transfer lebih dari saldo yang ada, dan saldo kamu jadi angka negatif (yang nggak masuk akal).
Terdapat 2 jenis consistency yakni Strong Consistency dan Eventual Consistency.
- Strong Consistency memastikan semua user melihat data yang konsisten secara bersamaan, ini mirip dengan sistem monolith dimana ketika data disimpan maka user lain akan dapat melihat data yang sudah disimpan tersebut.
- Eventual Consistency biasanya terjadi pada sistem yang memiliki pola komunikasi asynchronous. Sehingga ketika data disimpan, sistem lain akan memiliki jeda sampai subscriber/receiver dari sistem tersebut dapat melihat perubahan yang sudah dilakukan oleh sistem tersebut. Mirip dengan konsep pub/sub pada microservice. Untuk konsep ini kita akan bahas di artikel terpisah.
Isolation
Isolation memastikan bahwa setiap transaksi berjalan secara independen, tanpa saling memengaruhi hasil transaksi lainnya, meskipun dijalankan bersamaan. Isolation menjamin bahwa transaksi pengguna A akan selesai terlebih dahulu sebelum transaksi pengguna B diproses. Jika stok barang hanya tersisa satu, maka transaksi A berhasil, dan transaksi B akan gagal karena stok habis.
π Tanpa Isolation: Dua transaksi bisa saja berjalan bersamaan, dan hasilnya stok barang bisa jadi minus (misalnya: A dan B sama-sama mendapatkan barang).
Tentu saja, semakin ketat isolation level suatu database semakin lambat performance transaksi yang akan terjadi. Artinya isolation level akan mempengaruhi performance pada transaksi kamu.
Ada 4 tingkat isolation level pada database mulai dari yang paling rendah hingga yang paling ketat: Read Uncommitted, Read Committed, Repeatable Read, dan Serializable.
- Read uncommitted dikenal dengan dirty read yakni dapat melihat data yang dilakukan oleh transaksi yang lain, tetapi dengan read uncommitted dapat mempercepat performance dari sebuah query transaksi.
- Read committed hanya dapat melihat data yang sudah di commit saja.
- Repeatable Read memastikan data yang diproses konsisten. Apabila transaksi lain melakukan commit ketika query dijalankan, maka data tersebut tidak belum dianggap berubah. Contohnya Transaksi A membaca saldo rekening sebagai Rp1.000.000. Sementara transaksi A masih berjalan, transaksi B mengubah saldo menjadi Rp900.000 dan melakukan commit. Namun, transaksi A tetap melihat nilai Rp1.000.000 selama prosesnya belum selesai.
- Serializable: Ini adalah tingkat isolasi tertinggi. Semua transaksi dijalankan seolah-olah dilakukan secara berurutan, satu per satu, transaksi akan diletakkan pada antrian. Ini mencegah phantom reads (data baru yang muncul selama transaksi berjalan).
Durability
Durability adalah salah satu properti penting dalam database yang memastikan bahwa data yang sudah di-commit akan disimpan secara permanen dan tidak hilang, bahkan jika terjadi kegagalan sistem atau pemadaman listrik. Hal ini dicapai dengan menyimpan data ke penyimpanan non-volatile seperti SSD, hard drive, atau cloud storage.
π Tanpa Durability: Kalau ada listrik mati atau server crash ketika melakukan pembayaran, data pembayaranmu bisa hilang, dan sistem nggak tahu kamu sudah bayar atau belum.
Ada beberapa cara yang bisa dilakukan untuk mencapai data durability:
- Write-Ahead Logging (WAL): Semua perubahan yang di-commit dicatat terlebih dahulu di log dan dapat dipulihkan jika terjadi kegagalan.
- Checkpointing: Mekanisme ini secara berkala menyimpan semua data yang ada di memori (RAM) ke penyimpanan permanen (checkpointing), sehingga data tetap aman jika terjadi crash.
Contoh ACID pada RDMS (MySQL, PostgreSQL, SQL Server)
- Menerapkan transaction management pada saat melakukan command dan query
- Menerapkan locking mechanisms untuk mengatur database transaction.
- Menerapkan log saat menyimpan data ke database
- Menerapkan constraint seperti Primary Key, Foreign Key dan aturan lain (seperti kolom tidak boleh minus / unsigned dan lain lain).
Lalu apa pentingnya ACID ini ?
ACID adalah prinsip fundamental yang menjaga integritas dan keandalan database, terutama dalam sistem yang memproses banyak transaksi secara bersamaan. Tanpa ACID, kita akan menghadapi masalah seperti data yang tidak konsisten, transaksi yang saling tumpang tindih, atau kehilangan data penting.