Menggunakan “Transaction” dengan PDO

Ilustrasi sumber : http://www.feldmanlawoffices.com/img/transaction.gif

A transaction is a unit of work that is performed against a database. Transactions are units or sequences of work accomplished in a logical order, whether in a manual fashion by a user or automatically by some sort of a database program.

A transaction is the propagation of one or more changes to the database. For example, if you are creating a record or updating a record or deleting a record from the table then you are performing transaction on the table. It is important to control transactions to ensure data integrity and to handle database errors.

Practically you will club many SQL queries into a group and you will execute all of them together as a part of a transaction.

Sumber : http://www.tutorialspoint.com/sql/sql-transactions.htm

Fitur SQL Transaction lazim digunakan ketika kita akan memproses data-data yang penting dalam sistem. Biasanya SQL Transaction berhubungan dengan proses terhadap lebih dari satu buah tabel yang berhubungan. Misalnya dalam sistem penjualan, apabila ada barang terjual maka stock dalam gudang akan berkurang. Apabila kita tidak hati-hati dalam merancang program, bisa saja sistem yang kita buat akan kacau dan tidak ada kecocokan antara tabel-tabel didalamnya, seperti dalam kasus penjualan tadi, bisa saja terjadi barang terjual tetapi stock tidak berkurang, dikarenakan ketika memproses data penjualan terdapat kesalahan yang dalam hal ini berkaitan dengan tabel stock.

Transaction memiliki perintah-perintah yang dipergunakan untuk mengontrol proses SQL didalamnya. Yaitu :

  • Commit : Menyimpan transaksi jika proses berhasil
  • Roolback : Mengembalikan transaksi (jika proses tidak berhasil)
  • Savepoint : Menentukan titik untuk penyimpanan ketika akan di rollback
  • Settransaction : Menentukan nama transaksi

Itu semua adalah sedikit teori dari SQL Transaction. Berikut ini akan saya berikan contoh penggunaanya. Yaitu kita memiliki dua buah SQL yang harus dikerjakan, yang pertama adalah menyimpan sebuah data ke dalam tabel, yang kedua adalah menampilkan data yang baru saja disimpan.

Proses ini jika tidak menggunakan transaction juga bisa, tetapi jika ada kegagalan dalam salah satu SQL tersebut akan menyebabkan data menjadi tidak valid. Misalnya proses menyimpan data sudah bisa dijalankan, tetapi proses kedua yaitu menampilkan data terdapat kesalahan maka jika tidak menggunakan transaction, SQL pertama akan tetap berjalan dan data tetap disimpan, padahal seharusnya data tidak bisa disimpan karena proses SQL kedua gagal, oleh karena itu kita menggunakan transaction.

Implementasinya adalah sebagai berikut

<?php
try{
$db = new PDO('mysql:host=localhost;dbname=jobsheet;charset=UTF-8', 'root', 'root'); /** sesuaikan dengan database yang anda gunakan **/
 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $db->beginTransaction();
 $query_insert = "INSERT INTO mahasiswa (nim,nama,jenis_kelamin,prodi,alamat)  /** sesuaikan dengan tabel Anda **/
 VALUES (:nim,:nama,:jenis_kelamin,:prodi,:alamat)";/** sesuaikan dengan tabel Anda **/
 $stmt = $db->prepare($query_insert);
 $stmt->execute(array(
 ':nim'=>'1234555',
 ':nama'=>'Dwi W',
 ':jenis_kelamin'=>'L',
 ':prodi'=>'TI',
 ':alamat'=>'Malang',
 ));
 $lastId = $db->lastInsertId();
 $query = "SELECT * FROM mahasiswa WHERE id=?";
 $stmt = $db->prepare($query);
 $stmt->execute(array($lastId));
 $stmt->setFetchMode(PDO::FETCH_BOTH);
 $db->commit();
 }catch(PDOException $e){
 $db->rollBack();
 echo $e->getMessage();
 }

?>

Script di atas merupakan potongan script untuk implementasi penggunaan SQL transaction, untuk menampilkan datanya bisa ditambahkan script berikut di bawahnya

/** script sebelumnya **/

table border="1">
 <tr>
 <th>No</th><th>NIM</th><th>Nama</th><th>Jenis Kelamin</th><th>Program Studi</th><th>Alamat</th>
 </tr>
 <?php while($row = $stmt->fetch() ){ ?>
 <tr>
 <td><?php echo $row['id'] ?></td>
 <td><?php echo $row['nim'] ?></td>
 <td><?php echo $row['nama'] ?></td>
 <td><?php ($row['jenis_kelamin']=='L') ? print('Laki-Laki'):print('Perempuan'); ?></td>
 <td><?php if ($row['prodi']=='TI') echo 'Teknik Informatika'; elseif ($row['prodi']=='TT') echo 'Teknik Telekomunikasi'; else echo 'Teknik Mekatronika' ;?></td>
 <td><?php echo $row['alamat'] ?></td>
 </tr>
 <?php
 }
 $stmt->closeCursor();
 $dbh=null;
 ?>
 </table>

Proses transaction dapat kita lihat apabila terdapat kesalahan pada salahsatu SQL, misalnya pada SQL kedua kita ganti menjadi

$query = "SELECT * FROM mahasiswa WHERE number=?";

yang pasti akan terjadi error, nah ketika terjadi error query SQL pertama yaitu INSERT tidak akan dijalankan. Jika tidak menggunakan transaction, maka SQL pertama akan tetap dijalankan meskipun terdapat error pada SQL kedua.

Semoga bermanfaat..