Showing posts with label MySQL. Show all posts
Showing posts with label MySQL. Show all posts

2 August 2016

Cara Menggunakan Prosedur Transaction MySQL di PHP


Sering kita denger transaction, banyak terjadi transaction yang sering membingungkan. Ternyata metode transaction ini sangatlah mudah. Kejadi transaction ini biasanya jika terjadi banyak relasi antar table pada database kita, sehingga membuthkan banyak logika untuk menjalankan beberapa query sekaligus agar berjalan sesuai prosedur yang harus sesuai dengan aturan bisnis perusahaan.

Pada dasarnya fungsi transaction sudah ada pada DBMS (Data Base Managemen System) itu sendiri, dimana prosedur ini membuat orang dengan mudah menjalankan beberapa query yang nantinya jika terjadi error pada salah satu query dapat kita batalkan untuk query yang lainnya yang telah berhasil karena dapat mempengaruhi data yang akan di proses. Untuk lebih jelasnya mengenai transaction bisa baca di sini.

Bagaimana penerapan prosedur transaction pada pemorgraman PHP ?

Langsung saja kita praktikan, kali ini saya akan ceritakan sedikit bagaimana penerapan prosedur transaction ini, contoh transaksi pemindahan uang, saat kita melakukan transfer uang, jika kita melakukan transfer uang kita perlu melakukan pengurangan pada saldo kita dan akan ditambahkan pada saldo yang akan kita transfer. Bagaimana jika saat transfer terjadi trouble atau gangguaan, salah satu masalah yang bisa terjadi jumlah saldo kita berkurang dan saldo yang kita transfer tidak akan bertambah ke pemiliknya, maka perlunya ada pembatalan proses, hal yang seperti ini lah perlu adanya prosedur transaction akan di jalankan.

Makin pusing kalo saya bercerita, dari pada nalar saya semakin bertambah dan semakin panjangnya ketikan saya, lebih baik kita langsung contoh kan dalam bentuk source codenya..hehhe, mohon maaf dulu sebelumnya, apapun yang saya sampaikan semua ilmu ini berasalnya dari maha pencipta (Allah) dialah pemilik segala ilmu dan maha mengetahui, saya lah yang paling bodoh yang memiliki banyak kekurangan.

Untuk contoh lainnya seperti, transaksi penjualan, transaki peminjaman, kredit, dan lain sebagainya.

pertama perlu kita buat dulu sebuah database dengan struktur table sebagai berikut :
Table : nasabah

table nasabah pemilik rekening dan jumlah saldo

Table : transfer_saldo
table ini bertujuan untuk mencatat semua bukti transfer yang dilakukan

Silah kan tambah data pada table nasabah, 2 record seperti berikut :

di mana nanti pemilik rekening A akan mentransfernya k rekening B
yang perlu dilakukan adalah membuat form login terlebih dahulu, temen-temen bebas jika ingin menambahkan password jika teman ingin lakukan. Saya hanya sekedar contohnya saja.

tampilan halaman login nasabah 

halaman nasabah setelah login


Source code lengkapnya beirkut ini :

login_nasabah.php

<!DOCTYPE html>
<html>
<head>
 <title>Login Nasabah</title>
</head>

<style type="text/css">
 label {
  width: 120px;
  float: left;
 }
</style>

<body>
<h2>Login Nasabah</h2><hr>
<form action="" method="POST">
 <p>
 <label>Nomor Rekening</label> 
 : <input type="text" name="no_rek" placeholder="ketik nomor rekening ...">
 </p>
 <p>
 <label>&nbsp;</label>
 &nbsp; <input type="submit" name="submit" value="Login">
 </p>
</form>

<?php
 session_start();
 mysql_connect("localhost", "root", "");
 mysql_select_db("db_tes");

 if (isset($_POST['submit'])) {
  $sql = "SELECT * FROM nasabah WHERE no_rek = '$_POST[no_rek]'";
  $result = mysql_query($sql);

  $temukan = mysql_num_rows($result);

  if ($temukan > 0) {
   $_SESSION['norek'] = $_POST['no_rek'];

   header("location:halaman_nasabah.php");
  }
  else
  {
   echo"Nomor rekening tidak ditemukan...";
  }
 }

?>

</body>
</html>

halaman_nasabah.php

<?php
 session_start();

 if (!isset($_SESSION['norek'])) {
  header("location:login_nasabah.php");
 }
?>
<!DOCTYPE html>
<html>
<head>
 <title>Halaman Nasabah</title>
</head>
<style type="text/css">
 label {
  width: 180px;
  float: left;
 }
</style>
<body>

<h2>Halaman Nasabah</h2><hr>

<?php
 mysql_connect("localhost", "root", "");
 mysql_select_db("db_tes");

 $sql = "SELECT * FROM nasabah WHERE no_rek = '$_SESSION[norek]'";
 $result = mysql_query($sql);

 $n = mysql_fetch_assoc($result);

 $saldo_awal = $n['saldo'];

 echo"<p><b>$n[nama]</b> | [<a href='logout_nasabah.php'>Logout!</a>]<br>
 Saldo : Rp. ".number_format($n['saldo'])."</p><hr>";

 echo"History Transfer<hr><i>";
 $resHistory = mysql_query("SELECT * FROM transfer_saldo WHERE no_rek_pengirim = '$_SESSION[norek]'");
 while ($h = mysql_fetch_assoc($resHistory)) {
  echo"$h[tgl_time] - Berhasil Transafer dana ke nomor rekening : $h[no_rek_penerima] senilai : Rp. ".number_format($h['jumlah_transfer']).",- <br>";
 }
 echo"</i>";

?>

<br><br>

<b>Lakukan Transfer Dana</b><hr>

<form action="" method="POST">
<p>
 <label>Nomor Rekening Tujuan</label>
 : <input type="text" name="no_rek" placeholder="nomor rekening tujuan ...">
</p>
<p>
 <label>Jumlah Transfer (Rp.)</label>
 : <input type="text" name="jml_transfer" placeholder="0">
</p>
<p>
 <label>&nbsp;</label>
 &nbsp; <input type="submit" name="submit" value="Transfer">
</p>
</form>

<?php
 if (isset($_POST['submit'])) {
  if (is_numeric($_POST['jml_transfer']) AND ($saldo_awal > $_POST['jml_transfer'])) 
  {
   //cek apakah nomor rekening sudah benar dan bukan nomor rekening pribadi, biar gak ngirim k rekening pribadi..hehhee, emangnya bisa transfer ke rekening pribadi..hahaaaa

   $cek_tujuan = mysql_query("SELECT * FROM nasabah 
    WHERE no_rek = '$_POST[no_rek]' AND no_rek NOT LIKE '$_SESSION[norek]'");
   if(mysql_num_rows($cek_tujuan) > 0)
   {
    //jika semua validasi sudah benar maka kita buat prosedur transaction dimulai dari sini
    //tapi sesua kebutuhan agan-agan
    mysql_query("START TRANSACTION");

    //query pengurangan saldo
    $resPengurangan = mysql_query("UPDATE nasabah SET saldo = saldo - $_POST[jml_transfer] 
            WHERE no_rek = '$_SESSION[norek]'");

    //query penambah saldo
    $resPenambahan = mysql_query("UPDATE nasabah SET saldo = saldo + $_POST[jml_transfer] 
            WHERE no_rek = '$_POST[no_rek]'");

    //query tambah data transfer
    $resTransfer = mysql_query("INSERT INTO transfer_saldo(no_rek_pengirim, 
                  no_rek_penerima, 
                  jumlah_transfer, 
                  tgl_time)
                VALUES('$_SESSION[norek]', 
                  '$_POST[no_rek]', 
                  $_POST[jml_transfer], 
                  NOW())");

    if (!$resPengurangan OR !$resPenambahan OR !$resTransfer) 
    {
     echo"Gagal melakukan transfer senilai : Rp. ".number_format($_POST['jml_transfer']).",- ke nomor rekening : ".$_POST['no_rek'];
     mysql_query("ROLLBACK");
    }
    else
    {
     echo"Berhasil melakukan transfer senilai : Rp. ".number_format($_POST['jml_transfer']).",- ke nomor rekening : ".$_POST['no_rek']. " | [<a href='halaman_nasabah.php'>Reload Page</a>]";
     mysql_query("COMMIT");
    }


   }
   else
   {
    echo"Nomor rekening tujuan tidak tepat!";
   }

  }
  else
  {
   echo"Saldo tidak cukup";
  }
 }

?>



</body>
</html>

Jika kita coba melakukan transfer dana maka akan terlihat tampilan sebagai berikut :
input nomor rekening dan jumlah transfer

pesan yang akan disampaikan jika berhasil, jika tidak berhasil makan seluruh query kita akan di batalkan

Kebetulan prosesnya dalam satu page, maka kita perlu reload page...

Semoga bisa bermanfaat, dan dapat menambah wawasan kita semua.. Teriamakasih dan salam buat semua para programmer. Sampai jumpa di tutorial berikutnya.

Download Source Code lengkapnya :
  1. login_nasabah.php : Download
  2. halaman_nasbah.php : Download
  3. logout_nasbah.php : Download
  4. database : Download









30 July 2016

Belajar Teknik TRANSACTION, COMMIT, ROLLBACK MySQL


TRANSACTION MYSQL
Pengubahan, penambahan, penghapusan suatu tabel biasanya berdampak pada isi tabel satu dengan lainnya. Jika perubahan tabel satu dengan lainnya yang terkait, terjadi kagagalan, maka terjadi ketidakkonsistenan integrasi antar tabel.

MySQL mendukung manajemen transaksi dengan syarat pada saat menciptakan tabel menggunakan mesin penyimpanan InnoDB.

Pertama, yang kita bahas konsep dari level isolasi dan sesi

Level Isolasi

Sebelum kita berbicara transaksi dan level kelompok, kita perlu untuk jelaskan konsep dari suatu sesi. Suatu sesi database adalah suatu koneksi yang unik database yang memulai ketika anda login ke MySQL dan mengakhiri koneksi, dengan tegas ketika MySQL menberikan pesa bahwa program klien yang anda pakai terputus

Tingkat isolasi suatu transaksi juga menentukan derajat tingkat bagi yang transaksi menenpati ACID yang akan uraikan dibagian ini. Masing-Masing dari empat tingkatan isolasi menghadirkan suatu keseimbangan yang berbeda antar isolasi dan concurrency dari transaksi. Di level isolasi yang paling tinggi, seluruh transaksi akan mampu melaksanakan secara bersamaan,.

READ UNCOMMITTED

Ini adalah tingkatan isolasi yang mungkin paling rendah. Kadang-kadang memanggil dirty read, tingkatan ini mengijinkan suatu transaksi membabaca rekaman yang belum di commit. Penggunaan tingkatan isolasi ini mungkin meningkatkan keberhasilan hanya satu pemakai yang mendapat kembali data yang diubah oleh pemakai lain..

READ COMMITTED
Pada tingkatan isolasi ini, rekaman hanya dapat dilihat oleh suatu transaksi. Lagi pula, statemen hingga batas tertentu perubahan apapun yang dilakukan memulai eksekusi tidak bisa dilihat. Sebagai contoh, jika anda menjalankan perintah SELECT Suatu yang query dari tabel BUKU, dan sesi B memasukkan suatu baris ke dalam BUKU sedangkan suatu query masih menjalankan, baris yang baru itu tidak akan terlihat oleh perintah SELECT

REPEATABLE READ
Pada level isolasi ini tidak ada perubahan bagi database yang dibuat oleh lain sesi karena transaksi dapat dimulai dilihat di dalam transaksi, sampai transaksi dilakukan atau loop mundur atau ROLLBACK (pembatalan) jika Anda menjalankan ulang SELECT di dalam transaksi , akan selalu menunjukkan yang sama menghasilkan.

SERIALIZABLE
Pada tingkat isolasi, tiap-tiap transaksi dengan sepenuhnya terisolasi sedemikian rupa sehingga transaksi bertindak seolah-olah mereka telah mengeksekusi berturutan, satu demi satu; berturut-turut. Dalam rangka mencapai ini, RDBMS akan secara khusus mengunci tiap-tiap baris yang dibaca, maka lain sesi tidak boleh memodifikasi data itu sampai transaksi telah selesai dengan itu. Kunci dilepaskan ketika Anda melakukan atau batalkan transaksi

Bentuk Umum perintah tansakasi :

SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED
|REPEATABLE READ | SERIALIZABLE}

Perintah Manajemen Transaction
MySQL menggunakan yang berikut statemen manajemen transaksi :

START TRANSACTION
Marupakan awal dari blok perintah untuk melakukan transakasi

COMMIT
Melakukan perubahan atau secara fisik pada tebal

ROLLBACK
Perintah ini jika dijalankan suatu perubahan secara keseluruhan dalam blok transakasi dibatalakn.

SAVEPOINT savepoint_name
Menciptakan suatu savepoint yang dinamai identifier bahwa dapat target dari suatu ROLLBACK KE SAVEPOINT statemen.

ROLLBACK TO SAVEPOINT savepoint_name
Melaksanakan suatu rollback semua statemen yang telah dieksekusi sejak ditetapkan savepoint telah diciptakan. Dengan cara ini, kamu dapat mengulang mundur hanya bagian dari suatu transaksi, memelihara beberapa subset dari perubahan untuk tetap diselamatkan.

SET TRANSACTION
Ijinkan kamu untuk memilih level pengasingan terhadap transaksi. Secara detail terdapat pada bagian Level isolasi.

LOCK TABLES
Dengan tegas mengunci satu atau lebih tabel. Dicatat bahwa LOCK TABLES secara implisit menutup manapun transaksi yang sekarang ini terbuka. Kita merekomendasikan bahwa kamu dengan tegas melakukan atau loop ulang transaksi sebelum LOCK TABLES statemen apapun.

untuk contoh yang jelas dan lengkap silahkan klik link berikut : https://badiyanto.wordpress.com/category/tutorial-mysql/