Sabtu, 25 April 2009

MySQL Transaction

Mungkin ada yg pernah mengalami, dalam satu proses terdiri dari banyak query, misalkan ada 3 insert, 2 update, 1 delete... sekarang pernah-kan terbayang kalau misalkan salah satu query tersebut terjadi error, maka data tersebuat akan menjadi tidak valid-kan.... dan coba bayangkan juga kalau itu ada hubungannya dgn transaksi uang... wow... ngeri banget-kan....

sejak MySQL versi 3.23, MySQL memiliki feature untuk menangani hal seperti di atas, namanya adalah MySQL Transaction, jadi bila terjadi error/problem pada sebuah query dalam blok transaksi, semua perubahan yg terjadi disebelumnya akan diabaikan dan query selanjutnya akan di abaikan juga atau istilah nya ROLLBACK,


pola nya adalah di bawah ini:

START TRANSACTION;

[BLOK QUERY]

COMMIT/ROOLBACK;


untuk menggunakan feature transaction, harus dimulai dengan START TRANSACTION di akhir dengan COMMIT atau ROLLBACK. Commit adalah sebuah perintah untuk menyimpan perubah secara fisik ke database, sedangkan Rollback akan mengabaikan semua perubahan dan yg kedua store engine tabel yang digunakan adalah innoDB


langsung aja ke contoh kasus,

"misalkan di aplikasi kita di perlukan sebuah proses untuk menyimpan data pemesan barang, dan dalam satu proses bisa terjadi lebih dari satu query tergantung jumbah barang yg di pesan, dan melibat-kan dua tabel yaitu tabel untuk menyimpan data pemesan dan data barang yg di pesan."

tbl_pesanan_mst : untuk menyimpan data pemesan

CREATE TABLE `db_test`.`tbl_pesanan_dtl` (
`kode_dtl` char(10) NOT NULL,
`kode_mst` char(10) NOT NULL,
`kode_brg` char(10) NOT NULL,
`jml` int(11) NOT NULL,
PRIMARY KEY (`kode_dtl`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='tabel untuk menyimpan pesana detail'


tbl_pesanan_dtl : untuk menyimpan data dari barang2 yang di pesan oleh pemesan

CREATE TABLE `db_test`.`tbl_pesanan_mst` (
`kode` char(10) NOT NULL,
`nama` varchar(255) NOT NULL,
`alamat` text NOT NULL,
`status` enum('0','1') NOT NULL COMMENT '0=belum dikirm, 1=sudah dikirim',
PRIMARY KEY (`kode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='tabel untuk menyimpan data2 pesanan'


dibawah ini contoh blok teransaksinya

START TRANSACTION;

insert into tbl_pesanan_dtl values ('PSNDTL0001','PSN0000001','BRG0000001',10);
insert into tbl_pesanan_dtl values ('PSNDTL0002','PSN0000001','BRG0000002',20);
insert into tbl_pesanan_dtl values ('PSNDTL0003','PSN0000001','BRG0000003',30);
insert into tbl_pesanan_dtl values ('PSNDTL0004','PSN0000001','BRG0000004',40);
insert into tbl_pesanan_dtl values ('PSNDTL0005','PSN0000001','BRG0000005',50);

insert into tbl_pesanan_mst values ('PSN0000001','Dendie','Jalan Asmi No 18 Bandung',1);

COMMIT;


dgn statemen di atas... semua query akan di tulis ke database secara permanen bila tidak ada satu-pun query yang error atau terjadi problem. START TRANSACTION adalah sebagai awal blok transaksi dan COMMIT adalah perintah untuk eksekusi-nya.

oke... siip udah nangkap maksudnya... bagian dasar udah di jelaskan, sip.... itu-kan masih *mentah*, sekarang kita modifikasi sedikit agar lebih enak pakai nya....

dari script di atas akan kita tambahkan bila terjadi error maka otomatis akan ROLLBACK, kalau berhasil akan COMMIT, dan akan di jadikan sebuah STORE PROCEDURE, oke... ini cara buat nya.

DELIMITER $

CREATE PROCEDURE sp_input_pesanan()
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND ROLLBACK;

START TRANSACTION;

insert into tbl_pesanan_dtl values ('PSNDTL0001','PSN0000001','BRG0000001',10);
insert into tbl_pesanan_dtl values ('PSNDTL0002','PSN0000001','BRG0000002',20);
insert into tbl_pesanan_dtl values ('PSNDTL0003','PSN0000001','BRG0000003',30);
insert into tbl_pesanan_dtl values ('PSNDTL0004','PSN0000001','BRG0000004',40);
insert into tbl_pesanan_dtl values ('PSNDTL0005','PSN0000001','BRG0000005',50);

insert into tbl_pesanan_mst values ('PSN0000001','Dendie','Jalan Asmi No 18 Bandung','0');

COMMIT;
END$

DELIMITER ;


pada STORE PROCEDURE, diatas bagian yang penting adalah
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND ROLLBACK;

perintah di atas artinya adalah akan meng-HANDLE bila terjadi error, warning dan proses2 yang abnormal maka akan di lakukan perintah ROLLBACK


kalau implementasi dalam level aplikasi gimana, nah sebetulnya kalau kita udah bikin store procedure seperti diatas, tinggal di panggil aja store procedure nya, tapi kalau ngak mau pake store procedure... caranya seperti dibawah ini, sebagai contoh gw pake PHP.


mysqli_autocommit($dbh, FALSE);

$result=mysqli_query($dbh, $query1);
if ($result !== TRUE) {
mysqli_rollback($dbh);
//kalau ada error di query 1 akan di rollback
}

$result=mysqli_query($dbh, $query2);
if ($result !== TRUE) {
mysqli_rollback($dbh); //
kalau ada error di query 2 akan di rollback
}
}

//kalau ngak ada error maka akan di commit
mysqli_commit($dbh);

mysqli_close($dbh);
?>



SELESAI

22 komentar:

  1. kk......variabel $dbh itu dari mana?? dan itu berisi apa??

    BalasHapus
  2. $dbh adalah varibale yang isi nya nama database nya.. bro
    contoh :
    $dbh = 'database_buku'

    BalasHapus
  3. wah tengkyu buat tutorialnya....lagi bingun cara make store procedure......

    BalasHapus
  4. masih bingung nih,, kalo ingin set variable output store procedure saat terjadi error transaction gimana caranya?
    trus SET autocommit pada store procedure ditulis sebelum transaksi atau setelah commit?

    thanks.

    BalasHapus
  5. bila transaksi dilakukan pada level aplikasi makan SET autocommit di set false sebelum transaksi, seperti dibawah ini

    mysqli_autocommit($dbh, FALSE);

    hal diatas memberi tahu....
    bahwa auto commit dimatikan..
    dan proses commit dilakukan setelah ada perintah commit.

    BalasHapus
  6. Sori, mau tanya..
    sebelum saya pake format Procedure dan memanggilnya lewat PHP,
    harus ditempatkan dimana baris procedurenya itu?
    apa di halaman php itu juga?
    atau di halaman lain?

    mohon pencerahannya, brader...

    BalasHapus
  7. baris procedure ?????
    memanggil procedure dapat di panggil halaman php yang membutuhkan procedure itu saja..

    begitukah maksudnya ??/

    BalasHapus
  8. bukan, jadi begini...
    untuk kasus di atas,
    misalnya kita sudah membuat sebuah procedure:

    ------------------------------------------------------
    DELIMITER $

    CREATE PROCEDURE sp_input_pesanan()
    BEGIN

    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND ROLLBACK;

    START TRANSACTION;

    insert into tbl_pesanan_dtl values ('PSNDTL0001','PSN0000001','BRG0000001',10);
    insert into tbl_pesanan_dtl values ('PSNDTL0002','PSN0000001','BRG0000002',20);

    COMMIT;
    END$

    DELIMITER ;
    -----------------------------------------------------

    nah, baris procedure di atas itu ditulis atau disimpan dimana?
    apakah di halaman php yang memenggilnya atau di halaman lain?

    Mkasih..

    BalasHapus
  9. ditulisnya/di buat nya di database msyql...
    bisa pake consol atau pake mysql client seperti phpmyadmin, navicat dsb nya..

    di php tempat memanggil sp tersebut...

    BalasHapus
  10. terima kasih gan.. tugas ane terselesai kan.... ^^

    BalasHapus
  11. InnoDB udah bisa dipake sejak versi 3. Bukannya baru ada di versi 5.

    http://dev.mysql.com/doc/refman/4.1/en/innodb-configuration.html

    BalasHapus
  12. makasih buat koreksinya.

    BalasHapus
  13. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  14. nice share om

    BalasHapus
  15. permisi, ada cp yg bisa dihub
    mau nanya lebih ttg transact om
    please :'(

    BalasHapus
  16. Apakah utk menggunakan rollback, commit harus menggunakan mysqli? Apakah bisa juga dengan menggunakan mysql ?

    BalasHapus