![ACID pada Database: Atomicity](https://images.ctfassets.net/7wjlcr9d5ii8/3GbtqDT1AH6xknKaZ6G9X2/51b6128b89566a26d77f2f168e1fbb89/bohr_atom.jpg?w=652&h=405&fl=progressive&q=75&fm=jpg)
ACID merupakan singkatan dari Atomicity, Consistency, Isolation, dan Durability. Bahasan kali ini adalah Atomicity, yaitu memastikan transaksi pada satu sesi harus dieksekusi semuanya sekaligus atau tidak sama sekali. Ini gunanya adalah agar tidak ada data kotor yang tersisa di database ketika salah satu transaksi gagal tapi transaksi sebelumnya masih tertinggal di Database. Biar lebih jelas kita simulasikan data berikut:
Table Order
id | order_number | product |
---|---|---|
1 | ORD-123 | kopi |
2 | ORD-321 | susu |
Table Invoice
id | invoice_number | price | order_number |
---|---|---|---|
1 | INV-123 | 5000 | ORD-123 |
2 | INV-321 | 7000 | ORD-321 |
Atomicity Failure
Goalsnya disini adalah kita akan menyimpan data Order dan kemudian otomatis men-generate Invoice. Query yang dilakukan oleh aplikasi biasanya kurang lebih begini:
Insert Order
BEGIN;
INSERT INTO orders (order_number, product) VALUES ('ORD-777', 'teh');
COMMIT;
Insert Invoice
BEGIN;
INSERT INTO invoice (invoice_number, price, order_number) VALUES ('INV-777', 3000, 'ORD-777');
COMMIT;
Jika keduanya berhasil dieksekusi mungkin semuanya baik-baik saja. Tetapi misalnya ketika setelah berhasil eksekusi insertion Order, servernya crash, error, atau ada bugs yang membuat algoritmanya terhenti di tengah jalan. Ordernya jadi tetap tersimpan tapi tanpa Invoice. Ini tentu akan menyisakan data kotor. Untuk itu kita perlu membuat transaksi di atas menjadi Atomicity.
Atomicity Solution
BEGIN;
INSERT INTO orders (order_number, product) VALUES ('ORD-777', 'teh');
INSERT INTO invoice (invoice_number, price, order_number) VALUES ('INV-777', 3000, 'ORD-777');
COMMIT;
Sekarang misalkan servernya crash atau error di tengah jalan, data Order yang telah berhasil dieksekusi sebelumnya ga akan tersimpan di database karena commit database hanya bisa terjadi ketika kedua transaksi selesai dieksekusi. Ga ada lagi data yang ter-commit setengah-setengah.
Verdict
Setelah menerapkan Atomicity, kita berhasil terhindar dari data kotor yang tersimpan setengah-setengah. Goalsnya adalah masuk satu berarti harus masuk semua, jika ada salah satu yang gagal berarti semua transaksi lainnya pada sesi tersebut juga harus dibatalkan.
Untuk melihat tulisan terkait ACID lainnya bisa dibaca pada link berikut: