Transaction tujuan utamanya untuk mencegah kepincangan data.Transaction berguna jika kita punya proses yang menggunakan lebih dari satu table atau proses.Jika hanya satu tidak butuh transaction.
Sebagai contoh suatu sistem Dompet Digital yang memiliki fitur transfer saldo.Jika User A mentransfer saldo ke User B ,pasti sistem mengurangi saldo User A lalu menambah saldo User B.Jika saat penambahan saldo ke User B terjadi kesalahan, sedangkan saldo User A sudah berkurang.Maka akan terjadi kepincangan data.Apalagi jika ada proses history transfer juga gagal disimpan oleh sistem.
Tanpa transaction kita harus memikirkan bagaimana jika salah satu proses terjadi kegagalan.Dengan transaction tinggal memanggil satu perintah semua dikembalikan seperti kondisi awal sebelum transfer saldo.
Sekedar Informasi
Untuk database MySQL pastikan engine table tipenya InnoDB atau BDB karena tipe engine itu yang support untuk transaction.Untuk tipe MyISAM tipe support transaction.
Menggunakan Transaction
Berikut contoh penggunaan transaction di Codeigniter 4
<?php namespace App\Controllers;
use App\Models\PostModel;
use App\Models\PostCategoryModel;
class Post extends BaseController
{
public function create()
{
$post = new PostModel();
$post->db->transStart();
$post->insert([
'title'=>$this->request->getPost('title'),
'content'=>$this->request->getPost('content')
]);
$post_id = $post->insertID();
$postCategory = new PostCategoryModel();
$postCategory->insert([
'post_id'=>$post_id,
'category_id'=>$this->request->getPost('category_id')
]);
$post->db->transComplete();
}
}
Kode diatas menyimpan data kedua tabel post dan post_category.Kita menggunakan transaction agar ketika menyimpan ke post_category gagal ,data post otomatis juga terhapus seperti sebelum fungsi create dijalankan.
Menggunakan Transaction Secara Manual
Kita juga bisa menjalankan transaction secara manual, hal ini biasa dibutuhkan jika kita ada case khusus yang mengharuskan melakukan hal tersebut.
Ada beberapa perintah yang harus diketahui untuk menggunakan transaction secara manual:
- $this->db->transBegin() untuk memulai transaksi.
- $this->db->transRollback() untuk membatalkan semua transaksi setelah perintah transBegin().
- $this->db->transCommit() untuk menyimpan semua transaksi setelah metode transBegin()
- $this->db->transStatus() untuk mengcheck status dari transaction mengembalikan dua nilai true atau false.Untuk kasus ini kita tidak menggunakan transStatus.
Misalnya untuk kode sebelumnya kita tambah fungsi untuk membuat log transaksi.
<?php namespace App\Controllers;
use App\Models\PostModel;
use App\Models\PostCategoryModel;
class Post extends BaseController
{
public function create()
{
$post = new PostModel();
$post->db->transBegin();
try {
$post->insert([
'title'=>$this->request->getPost('title'),
'content'=>$this->request->getPost('content')
]);
$post_id = $post->insertID();
$postLog = $this->TransLog($this->request->getPost());
if($postLog===false){
throw new Exception();
}
$postCategory = new PostCategoryModel();
$postCategory->insert([
'post_id'=>$post_id,
'category_id'=>$this->request->getPost('category_id')
]);
$post->db->transCommit();
} catch (\Exception $e) {
$post->db->transRollback();
}
}
}
Kode diatas menggunakan try catch agar ketika $postLog mengembalikan nilai false.Pergi ke catch dan melakukan rollback.
Sekian tutorial kali ini.
Semoga bermanfaat.