Azis Hapidin Backend Developer, sering membuat REST API dan Web-Based Application (Full Stack). Kadang ngoprek-ngoprek server ketika diperlukan.

Mengenal Database Transaction

6 min read


Pembukaan

Bayangkan ada bagian aplikasi yang mempunyai flow seperti ini:

Sekilas tidak ada yang aneh dengan proses diatas, jika tidak ada masalah maka semua akan baik-baik saja. Tapi bayangkan apa yang akan terjadi jika pada flow diatas terjadi error (error coding/query, hardware, atau masalah lainnya) pada step ketiga, sedangkan step pertama dan kedua sudah terlanjur tereksekusi? Yang terjadi adalah stok produk dan saldo pembeli sudah berkurang sedangkan saldo merchant belum bertambah, tentunya hal seperti ini akan menjadi masalah serius pada aplikasi kita.

Solusinya bagaimana? Yaitu menggunakan Database Transaction, Dengan menggunakan Database Transaction maka kita akan memasukan ketiga query diatas kedalam satu blok dan DBMS akan menganggap ketiga query tadi menjadi suatu kesatuan, sehingga jika terjadi error pada salah satu query maka sistem akan membatalkan (rollback) query yang sudah di eksekusi sebelumnya. Konsep ini adalah pengertian dari Atomic yaitu do all or nothing (lakukan semua atau tidak sama sekali).

Begin, Commit, Rollback

Dalam implementasinya, kita akan bertemu dengan 3 istilah berikut:

  1. BEGIN/START TRANSACTION
  2. Ini adalah perintah untuk memulai sesi database transaction.

  3. COMMIT
  4. Commit adalah perintah untuk menyimpan semua perubahan pada database secara permanen, commit ini dijalankan setelah semua query dieksekusi dan tidak ada error sama sekali.

  5. ROLLBACK
  6. Rollback adalah perintah untuk membatalkan semua perubahan data, rollback ini akan dijalankan ketika ada salah satu query yang error. Jika kita menggunakan try..catch, maka perintah rollback ini biasa disimpan di blok catch.

Mengenal ACID

ACID merupakan singkatan dari Atomic, Consistency, Isolation dan Durability. Merupakan sifat yang harus dimiliki database untuk menjamin transaksi reliable (bisa diandalkan).

  1. Atomic
  2. Atomic artinya semua query harus dianggap sebagai satu kesatuan, dalam bagian ini kita mengenal istilah do all or nothing (lakukan semua atau tidak sama sekali).

  3. Consistency
  4. Consistency ini berkaitan dengan Integrity Constraints, jika ada masalah Integrity Constraints maka sistem akan otomatis me-rollback transaksi.

    Misal pada table transactions ada field product_id yang merupakan Foreign Key ke id pada table products. Maka jika kita melakukan insert ke table transactions dan memasukan product_id yang tidak ada pada table products maka DBMS akan otomatis me-rollback transaksi. Hal ini berlaku juga untuk Integrity Constraints lain seperti not null field, unique field, dll.

  5. Isolation
  6. Isolation berarti memastikan semua proses yang belum selesai (belum di commit) tidak akan bisa di akses pada sesi lain.

    Misal user A melakukan import 100 ribu data ke table transactions, jika user B membaca table transactions maka data yang sedang di import tadi harusnya tidak muncul karena belum di Commit. Begitupun jika user A melakukan operasi UPDATE atau DELETE, sebelum transaksi selesai maka sesi lain tidak akan bisa melihat perubahan tersebut.

    Kasus diatas akan terjadi jika Programmer melakukan Commit setelah semua data tersebut selesai di import, akan berbeda ceritanya jika sang Programmer melakukan Commit per 1 data.
  7. Durability
  8. Setelah transaksi selesai (sudah di commit) maka data harus benar-benar disimpan, misal setelah transaction di Commit kemudian terjadi hardware failure (server mati listrik, hardware error) maka data harus sudah tersimpan di database.

Implementasi Database Transaction

Implementasi pada MySQL

Pada MySQL untuk memulai Transaction kita bisa menggunakan perintah START TRANSACTION atau bisa juga dengan BEGIN, tapi pada contoh dibawah kita akan menggunakan BEGIN.

Contoh Rollback

Pada contoh dibawah kita akan mencoba untuk update stock Sampo Kelir menjadi 9, kemudian kita rollback agar stock Sampo Kelir kembali seperti semula menjadi 10.

Contoh Commit

Pada contoh dibawah kita akan melakukan perubahan stok pada salah satu produk, kemudian melakukan Commit.

Implementasi pada PHP + MySQL

Berikut ini contoh penggunaan Database Transaction jika kita menggunakan PDO (PHP Data Object) menggunakan try..catch:

Pada contoh diatas Rollback dijalankan pada catch (ketika ada exception). Jika memang dibutuhkan, kita juga bisa menyimpan rollback tersebut dalam block pengkondisian (if).

[Bonus] Implementasi pada Laravel

Untuk menggunakan Database Transaction pada Laravel kita cukup memasukan semua perintah pada closure \DB::transaction(), contohnya seperti ini:

Referensi:

  • https://medium.com/gits-apps-insight/mengenal-konsep-database-transaction-bagian-1-54e66789f75e
  • https://software.endy.muhardin.com/java/database-transaction/
  • https://www.w3resource.com/mysql/mysql-transaction.php
  • https://www.ibm.com/support/knowledgecenter/SSGMCP_5.4.0/product-overview/acid.html
  • https://www.geeksforgeeks.org/acid-properties-in-dbms/

Azis Hapidin Backend Developer, sering membuat REST API dan Web-Based Application (Full Stack). Kadang ngoprek-ngoprek server ketika diperlukan.