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
kk......variabel $dbh itu dari mana?? dan itu berisi apa??
ReplyDelete$dbh adalah varibale yang isi nya nama database nya.. bro
ReplyDeletecontoh :
$dbh = 'database_buku'
wah tengkyu buat tutorialnya....lagi bingun cara make store procedure......
ReplyDelete@anonim siip sama-sama
ReplyDeletemasih bingung nih,, kalo ingin set variable output store procedure saat terjadi error transaction gimana caranya?
ReplyDeletetrus SET autocommit pada store procedure ditulis sebelum transaksi atau setelah commit?
thanks.
bila transaksi dilakukan pada level aplikasi makan SET autocommit di set false sebelum transaksi, seperti dibawah ini
ReplyDeletemysqli_autocommit($dbh, FALSE);
hal diatas memberi tahu....
bahwa auto commit dimatikan..
dan proses commit dilakukan setelah ada perintah commit.
mantaab...
ReplyDelete@dian thanks
ReplyDeleteSori, mau tanya..
ReplyDeletesebelum 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...
baris procedure ?????
ReplyDeletememanggil procedure dapat di panggil halaman php yang membutuhkan procedure itu saja..
begitukah maksudnya ??/
bukan, jadi begini...
ReplyDeleteuntuk 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..
ditulisnya/di buat nya di database msyql...
ReplyDeletebisa pake consol atau pake mysql client seperti phpmyadmin, navicat dsb nya..
di php tempat memanggil sp tersebut...
terima kasih gan.. tugas ane terselesai kan.... ^^
ReplyDeleteInnoDB udah bisa dipake sejak versi 3. Bukannya baru ada di versi 5.
ReplyDeletehttp://dev.mysql.com/doc/refman/4.1/en/innodb-configuration.html
makasih buat koreksinya.
ReplyDeletemantab baget bos tutorialnya
ReplyDeleteMakasih
Deletetengkyu...
ReplyDeleteThis comment has been removed by the author.
ReplyDeletenice share om
ReplyDeletepermisi, ada cp yg bisa dihub
ReplyDeletemau nanya lebih ttg transact om
please :'(
Apakah utk menggunakan rollback, commit harus menggunakan mysqli? Apakah bisa juga dengan menggunakan mysql ?
ReplyDelete