Categories: MySQL

Pengertian dan cara transaction di MySQL database

Bismillaahirrohmaanirrohiim…

Secara sederhana, transaction merupakan kumpulan query yang dijalankan dalam satu proses transaksi.

Tujuan transaction

Atomicity : Tujuannya untuk memastikan bahwa semua query di dalam satu kesatuan proses selesai dengan sukses, jika ada satu saja yang gagal, transaksi dibatalkan pada titik kegagalan yang berarti operasi query sebelumnya dikembalikan ke keadaan semula.

Konsistensi : Tujuannya untuk memastikan bahwa database diubah dengan benar dan memastikan semua query transaksi berhasil dilakukan sehingga integritas data tetap terjaga.

Isolasi : Ini memungkinkan sekumpulan query transaksi dilakukan secara independen dan transparan satu sama lain.

Daya Tahan : Untuk memastikan bahwa hasil dari transaksi yang dilakukan tetap ada bahkan saat terjadi kegagalan sistem.

Umumnya transaction di MySQL digunakan untuk database yang berhubungan dengan operasi tabel yang banyak dan sensitif, misalnya berhubungan dengan keuangan, saldo, jual beli, dan data sensitif lainnya.

Contoh saat transfer uang, query pertama adalah memotong saldo pengirim, kemudian query kedua menambah saldo pada penerima. Bayangkan jika saat memotong saldo pengirim berhasil lalu server down kemudian saldo penerima belum bertambah, ini akan membuat data jadi bermasalah.

Syarat untuk melakukan transaction di database MySQL adalah harus bisa perintah dasar MySQL dulu, yaitu select, insert, update, delete, dan juga table engine mySQL nya innodb bukan myISAM, perintahnya menggunakan PDO.

Langsung saja, misalnya kita ingin insert table A, update table B, delete tabel C, dimana ketiga transaksi ini harus sukses semuanya, jika salah satu query gagal maka query sebelumnya digagalkan dan kondisi data dikembalikan seperti semula.

Download MySQL class

Klik di sini

Tulis kode di bawah ini

simpan dengan nama transaksi.php

<?php
include 'Db.class.php';

$db = new Db();


try {
  //start transaction
  $beginTransaction = $db->beginTransaction();

  //update insert
  $db->query('insert into tableA (a,b,c) values (1,2,3) ');

  //query update
  $db->query('update tableB set a=5 where b=2 ');

  //query delete
  $db->query('delete from tableC where a=2 ');


  //finish transaction
  $executeTransaction = $db->executeTransaction();//commit

} catch (PDOException $e) { 
    //atau (Exception $e) 
  $rollBack = $db->rollBack();
  echo "error msg: ".$e->getMessage();
  throw $e;
}

Nah, semua query harus berhasil, misalnya ada kegagalan ditengah, maka semua query sebelumnya digagalkan.

Menggunakan object oriented

<?php
$mysqli = new mysqli("localhost","my_user","my_password","my_db");

if ($mysqli -> connect_errno) {
  echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
  exit();
}

// Turn autocommit off
$mysqli -> autocommit(FALSE);

// Insert some values
$mysqli -> query("INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Peter','Griffin',35)");
$mysqli -> query("INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Glenn','Quagmire',33)");

// Commit transaction
if (!$mysqli -> commit()) {
  echo "Commit transaction failed";
  exit();
}

$mysqli -> close();

Object oriented begin transaction

//Start transaction 
$mysqli->begin_transaction();

$mysqli->query('INSERT INTO director(name) VALUE("Steven Spielberg")');

$directorId = $mysqli->insert_id;
$movieTitle = 'Jurassic Park';
$stmt = $mysqli->prepare('INSERT INTO movie(title, directorId) VALUE(?,?)');
$stmt->bind_param('ss', $movieTitle, $directorId);
$stmt->execute();

$mysqli->commit();
// Changes are committed and the transaction has ended

// Following queries will be committed one by one as soon as they are peformed.
$mysqli->query('INSERT INTO director(name) VALUE("James Cameron")');

$directorId = $mysqli->insert_id;
$movieTitle = 'Titanic';
$stmt = $mysqli->prepare('INSERT INTO movie(title, directorId) VALUE(?,?)');
$stmt->bind_param('ss', $movieTitle, $directorId);
$stmt->execute();

Menggunakan model procedural

<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit;
}

// Turn autocommit off
mysqli_autocommit($con,FALSE);

// Insert some values
mysqli_query($con,"INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Peter','Griffin',35)");
mysqli_query($con,"INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Glenn','Quagmire',33)");

// Commit transaction
if (!mysqli_commit($con)) {
  echo "Commit transaction failed";
  exit();
}

// Close connection
mysqli_close($con);
?>

Menggunakan model procedural yang lain

<?php

mysqli_begin_transaction($con);

// Insert some values
mysqli_query($con,"INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Peter','Griffin',35)");
mysqli_query($con,"INSERT INTO Persons (FirstName,LastName,Age)
VALUES ('Glenn','Quagmire',33)");

mysqli_commit($con);
?>

Demikian semoga bermanfaat.

Bagikan
rasupe

Recent Posts

CPU usage tinggi pada server

Bismillaahirrohmaanirrohiim... Untuk mendeteksi cpu usage tinggi memang perkara rumit, adakalanya karena codingan bermasalah, akses ke…

2 months ago

Membersihkan log mongodb yang besar

Bismillaahirrohmaanirrohiim... Jika tidak dirawat dan dicek berkala, log mongodb akan semakin membesar. Bahkan sampai menghabiskan…

2 months ago

Cara mengakses gps di HP dengan javascript

Bismillaahirrohmaanirrohiim... Jika kita membuat website yang digunakan untuk memantau lokasi HP client, maka kita memerlukan…

5 months ago

Menghitung jarak dua titik koordinat dengan php dan javascript

Bismillaahirrohmaanirrohiim... Kali ini kita akan mencoba menerapkan rumus trigonometeri dari formula haversine, yang digunakan untuk…

5 months ago

Kemasan cleo botol kecil sering bikin tangan terluka

Bismillaahirrohmaanirrohiim... Disini saya akan berbagi pengalaman tentang susahnya membuka tutup botol cleo kecil ukuran 220ml.…

5 months ago

Solusi InsCek pada meteran PLN

Bismillaahirrohmaanirrohiim... Kali ini saya akan berbagi pengalaman tentang mati lampu yang disebabkan oleh permasalahan arus…

5 months ago