Halo… Selamat datang kembali di blog Sandi Dharma. Gimana kabarnya hari ini? Semoga tetap semangat belajar koding ya. Pada postingan ini kita akan belajar bagaiamana caranya menggunakan database transaction di Laravel.
Apa Itu Database Transaction?
Sebelum kita menggunakan database transaction, tentu kita harus mengetahui terlebih dahulu apa itu database transaction.
Dalam konteks database, transaction adalah unit logika yang dijalankan secara independent Buat mengambil atau melakukan perubahan data. Sedangkan database transaction adalah kumpulan atau serangkaian operasi yang dilakukan dalam DBMS (Database Management Systam) terhadap database. Database transaction berfungsi Buat mengatur alur transaksi dalam suatu database Buat mempertahankan konsistensi data.
Berikut ini adalah beberapa proses dalam database transaction.
Begin
Begin digunakan Buat memberi tanda bahwa transaction akan di mulai.
Commit
Commit digunakan Buat memberi tanda bahwa Segala transaction telah selesai dan data harus disimpand dalam database. Commit harus diterapkan Kalau Ingin menyelesaikan database transaction.
Rollback
Rollback digunakan ketika terdapat kesalahan atau kegagalan pada Begitu transaction berlangsung. Rollback harus diterapkan agar Enggak terdapat perubahan parsial (sebagian) dalam database akibat kegagalan proses sehingga data tetap konsisten.
Bilaman Harus Menggunakan Database Transaction?
Database transaction biasanya digunakan pada Begitu melakukan transaksi yang merubah beberapa data sekaligus pada satu proses. Teladan kasusnya adalah sebagai berikut.
Pada suatu aplikasi penjualan online, terdapat sistem invoice Buat customer yang melakukan pembelian. Alurnya adalah sebagai berikut.
- Order dibuat dan Mempunyai status unpaid (belum dibayar)
- Tagihan dibayar oleh customer
- Status order dirubah menjadi paid (sudah dibayar)
Pada proses diatas, terdapat kemungkinan kegagalan Begitu merubah status order dari unpaid menjadi paid. Kalau proses tetap dilanjutkan maka status order Tetap tetap unpaid padahal pembayaran sudah berhasil dilakukan (data Enggak konsisten).
Pada kondisi seperti itulah kita memerlukan database transaction. Sehingga Begitu terjadi kegagalan, Segala perubahan yang dilakukan sebelumnya akan dibatalkan (rollback).
Teladan Database Transaction Dengan MySQL
Pada Teladan ini saya akan menggunakan satu tabel saja agar lebih sederhana.
Misalnya saya Mempunyai tabel items dengan data berikut ini:
mysql> select * from items;
+----+----------+-------+
| id | name | stock |
+----+----------+-------+
| 1 | Mouse | 20 |
| 2 | Keyboard | 4 |
| 3 | Monitor | 8 |
+----+----------+-------+
3 rows in set (0.00 sec)
Kemudian saya akan begin transaction dan mengupdate stock Buat item mouse menjadi 3.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> update items set stock = 3 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Sekarang kita lihat datanya.
mysql> select * from items;
+----+----------+-------+
| id | name | stock |
+----+----------+-------+
| 1 | Mouse | 3 |
| 2 | Keyboard | 4 |
| 3 | Monitor | 8 |
+----+----------+-------+
3 rows in set (0.00 sec)
Misalnya saya anggap terdapat kesalahan Begitu proses dijalankan. Saya Ingin membatalkan perubahan dengan Metode melakukan rollback.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.01 sec)
Kita lihat Kembali datanya
mysql> select * from items;
+----+----------+-------+
| id | name | stock |
+----+----------+-------+
| 1 | Mouse | 20 |
| 2 | Keyboard | 4 |
| 3 | Monitor | 8 |
+----+----------+-------+
3 rows in set (0.00 sec)
Sekarang stock item mouse kembali menjadi 20 seperti semula.
Lampau bagaimana Kalau Enggak Eksis kesalah dan Ingin menyimpan data?
Buat menyimpan data dan menyelesaikan transaction, kita tinggal gunakan perintah commit.
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
Tetapi karena sebelumnya sudah saya rollback, maka Enggak Eksis data yang dismpan dalam database ya.
Nah begitulah penerapan sederhana database transaction ketika melakukan perubahan data.
Menggunakan Database Transaction Di Laravel
Tentu kita Segala Paham bahwa laravel selalu menyediakan hal hal mendasar yang kita perlukan dalam Membikin aplikasi. Salah satunya adalah database transaction ini.
Buat menggunakan database transaction di laravel, caranya sangat mudah sekali. Database transaction tersedia di dalam Facade DB Punya laravel. Eksis dua Metode yang Dapat kita gunakan perhatikan Teladan kode berikut.
Metode Mekanis:
DB::transaction(function(){
// transaksi database di sini
}, 1);
Dengan menggunakan Metode di atas, kita cukup menuliskan transaksi database dalam callback function. Kalau terjadi kesalahan Begitu transaksi maka laravel Mekanis akan melakukan rollback data. Parameter kedua pada method transaction adalah jumlah berapa kali percobaan dilakukan. Misalnya Kalau 2 kali, maka ketika terjadi kesalahan proses akan diulangi Kembali, Kalau Tetap tetap salah baru kemudian rollback dijalankan.
Metode manual:
try {
DB::beginTransaction();
// transaksi database di sini
DB::commit();
} catch (\Throwable $th) {
DB::rollBack();
throw $th;
}
Metode berikutnya adalah menggunakan block try catch. Pada kode diatas, kita menulis transaksi database diantara beginTransaction dan commit, kemudian rollback pada block catch.
Kalau terjadi jesalahan Begitu transaski, maka error akan dilemparkan ke block catch dan rollBack akan dijalankan Buat mengembalikan data ke kondisi awal.
Teladan
Sebagai Teladan, di sini saya sudah menyediakan project laravel sederhana, dengan database berisi dua tabel Merukapan tabel order dan invoice.
Pada tabel order terdapat field is_paid yang mengindikasikan apakah order sudah terbayar atau belum.
Sedangkan pada tabel invoice terdapat field is_success yang mengindikasikan apakah pembayaran sukses dilakukan atau gagal.
Anggap saja Eksis sebuah proses dimana saya akan merubah is_success pada tabel invoice menjadi true dan is_paid pada tabel order menjadi true. Maka saya Dapat menuliskan kodenya kurang lebih seperti berikut.
Menggunakan Metode Mekanis
Route::get('test-transaction', function () {
// Membikin data invoice Buat Teladan
$invoice = new Invoice(['is_success' => false]);
$invoice->save();
// Membikin data order Buat Teladan
$order = new Order(['is_paid' => false]);
$order->save();
DB::transaction(function () use ($invoice, $order) {
// Transaksi database merubah invoice
$invoice->is_success = true;
$invoice->save();
throw new Error('error');
// Transaksi database merubah order
$order->is_paid = true;
$order->save();
});
});
Menggunakan Metode Manual (try-catch)
Route::get('test-transaction', function () {
// Membikin data invoice Buat Teladan
$invoice = new Invoice(['is_success' => false]);
$invoice->save();
// Membikin data order Buat Teladan
$order = new Order(['is_paid' => false]);
$order->save();
try {
// Memulai transaksi
DB::beginTransaction();
// Transaksi database merubah invoice
$invoice->is_success = true;
$invoice->save();
// Transaksi database merubah order
$order->is_paid = true;
$order->save();
// Commit transaksi
DB::commit();
} catch (\Throwable $th) {
// Rollback Kalau Eksis error
DB::rollBack();
throw $th;
}
});
Nah seperti itulah Metode menggunakan database transaction di laravel. Terdapat dua Metode yang Dapat Anda gunakan.
Buat mencoba apakah data berhasil di rollBack Anda Dapat mencoba manual menulis throw error dan lihat apakah data berhasil dirollback.
Pada Teladan diatas, database transaction langsung saya tulis dalam callback Punya router laravel. Ini hanya Buat menyederhanakan contohnya saja ya. Pada penerapannya, database transaction biasanya dituliskan di dalam service layer, atau paling maksimal di dalam controller. Selalu baca dan pelajari best practice dalam menulis kode ya…