Beranda > SQL > mysql-transaction

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. Commitadalah sebuah perintah untuk menyimpan perubah secara fisik ke database, sedangkan Rollback akan mengabaikan semua perubahandan 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 perintahROLLBACK

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);
?>

Source : http://dendieisme.blogspot.com/2009/04/mysql-transaction.html

Kategori:SQL
  1. Belum ada komentar.
  1. No trackbacks yet.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: