Apa Itu Transaksi pada Database Relasional?
Transaksi pada database merupakan konsep penting yang perlu dipahami developer. Walaupun begitu, banyak developer yang saya ketahui tidak mengetahui makna dari transaksi dalam konteks database. Untuk itu pada artikel ini akan saya coba jelaskan apa itu transaksi.
Contoh Masalah
Coba perhatikan contoh kasus berikut.
Budi memiliki saldo di rekeningnya sebesar 15000. Ia menjelajahi e-commerce favoritnya dan menemukan barang wishlist-nya dengan harga 5000 yang juga merupakan stok terakhir. Tanpa berpikir panjang Budi langsung checkout dan membayar barang tersebut.
Dari kasus di atas, diberikan asumsi terdapat 3 tabel database yang terlibat, antara lain,
- user_balance, merupakan tabel yang berisi informasi saldo Budi. Kita asumsikan ID saldo Budi adalah 3.
- item_stock, merupakan tabel yang berisi informasi stok item. Kita asumsikan ID stok item yang dibeli Budi adalah 5.
- merchant_balance, merupakan tabel yang berisi informasi saldo penjual item. Kita asumsikan ID saldo penjual adalah 10.
Secara sederhana, setelah Budi sukses melakukan pembayaran, update data pada database diharapkan terjadi seperti ini,
- UPDATE user_balance SET balance = 10000 WHERE id = 3
- UPDATE item_stock SET stock = 0 WHERE id = 5
- UPDATE merchant_balance SET balance = 5000 WHERE id = 10
Namun ternyata terjadi sesuatu yang tidak terduga. Sistem diduga down dan mengakibatkan update data terjadi seperti berikut,
- UPDATE user_balance SET balance = 10000 WHERE id = 3
- UPDATE item_stock SET stock = 4 WHERE id = 5
- Terjadi down pada sistem sehingga tabel merchant_balance gagal di-update (?)
Tabel merchant_balance tidak ter-update karena sistem tidak sempat meng-update datanya sebelum sistem down. Hal ini berakibat penjual tidak mendapat uang hasil penjualannya. Dalam dunia nyata kasus seperti ini dapat menjadi kesalahan yang fatal. Bayangkan apabila pihak penjual mengalami kerugian ratusan juta akibat kesalahan sistem seperti ini. Oleh karena itu, penting mengenal transaksi dan implementasinya pada database relasional.
Konsep Transaksi
Transaksi memiliki dua komponen utama, yaitu mulai transaksi dan selesaikan transaksi. Dalam implementasinya dalam database relasional (SQL), transaksi dapat dimulai dengan menggunakan syntax BEGIN
. Contohnya adalah sebagai berikut,
BEGIN;
UPDATE user_balance SET balance = 10000 WHERE id = 3;
UPDATE item_stock SET stock = 0 WHERE id = 5;
UPDATE merchant_balance SET balance = 5000 WHERE id = 10;
Komponen kedua adalah selesaikan transaksi. Semua transaksi wajib diselesaikan. Ada dua case dalam menyelesaikan transaksi, commit (simpan perubahan), atau rollback (jangan simpan perubahan). Menyelesaikan transaksi dengan commit berarti menyimpan perubahan-perubahan yang sudah dilakukan. Namun apabila transaksi diselesaikan dengan rollback, perubahan-perubahan yang dilakukan tidak disimpan, data pada database tidak akan berubah. Commit dapat dilakukan menggunakan syntax commit
sementara rollback menggunakan syntax rollback
.
Contoh penggunaan commit
,
BEGIN;
UPDATE user_balance SET balance = 10000 WHERE id = 3;
UPDATE item_stock SET stock = 0 WHERE id = 5;
UPDATE merchant_balance SET balance = 5000 WHERE id = 10;
COMMIT;
Contoh penggunaan rollback
,
BEGIN;
UPDATE user_balance SET balance = 10000 WHERE id = 3;
UPDATE item_stock SET stock = 0 WHERE id = 5;
UPDATE merchant_balance SET balance = 5000 WHERE id = 10;
ROLLBACK;
Data-data yang sudah di-update tidak akan disimpan dan dikembalikan ke data sebelumnya.
Bagaimana apabila terjadi sistem down / error di tengah proses transaksi (Belum di-commit / rollback) ?
Hal ini bergantung dari jenis database maupun konfigurasi database tersebut. Namun secara umum, transaksi yang tidak di-commit maupun rollback akan selalu dalam status running sampai transaksi tersebut diselesaikan / di-kill secara manual.
Transaksi yang belum selesai juga akan mempengaruhi proses transaksi lain yang mengakses data yang sama. Hal ini dikenal sebagai lock. Secara umum setiap perintah SQL akan mengunci / lock tabel maupun baris data sehingga transaksi lain tidak dapat memodifikasi maupun membaca data yang sedang digunakan.
Lalu apakah kita harus selalu menggunakan proses transaksi secara manual?
Untungnya tidak. Hampir semua database sudah menerapkan transaksi secara otomatis pada tiap baris syntax yang kita jalankan. Setelah eksekusi perintah selesai, database juga secara otomatis melakukan commit apabila tidak terjadi error, dikenal juga sebagai autocommit. Apabila terjadi error, database secara otomatis juga melakukan rollback.
Namun perlu juga dipahami bahwa penggunaan autocommit bisa jadi dapat merugikan. Dalam contoh kasus yang sudah dijelaskan di atas, apabila terjadi error di tengah proses update data di database (umumnya melibatkan beberapa tabel), ada beberapa data yang tidak di-update sehingga data dalam database menjadi tidak konsisten. Oleh karena itu, proses update data di database yang melibatkan beberapa data atau tabel sekaligus dapat dibungkus oleh transaksi secara manual.
Semoga bermanfaat dan terima kasih.