Pertemuan IX MANAJEMEN TRANSAKSI

dokumen-dokumen yang mirip
MODUL 10 TRANSACTION

Modul Praktikum Sistem Basis Data 2010

Manajemen Transaksi. Praktikum Sistem Basis Data. Gentisya Tri Mardiani, S.Kom., M.Kom

Administrasi Basis Data. Transaksi dan Lock. Yoannita

Transaction & Conccurency

Pertemuan VII TRIGGERS

Perintah MySQL Lanjutan

Manajemen Transaksi. Sistem Basis Data. Gentisya Tri Mardiani, S.Kom., M.Kom

Kusnawi, S.Kom, M.Eng

Manajemen Transaksi A. Konsep Transaksi 1. Membuat Tabel account dengan type Innodb

BAB V IMPLEMENTASI DAN PENGUJIAN

Concurrency Control Semester Ganjil 2014 Fak. Teknik Jurusan Teknik Informatika. Caca E. Supriana, S.Si.,MT. Si

LAPORAN PRAKTIKUM MODUL 1 PENGENALAN MYSQL

Transaksi. by: Ahmad Syauqi Ahsan

TRIGGER TRIGGER 5/29/2017 HANI IRMAYANTI, S.KOM

Pertemuan IV CONDITION & HANDLER CURSOR

Manajemen Transaksi (Penjadwalan & Kontrol konkurensi)

TUGAS 1 PRAKTIKUM SISTEM BASIS DATA

Contoh SQL Constraint

Persiapan Table Untuk Latihan Sebelum kita berkenalan lebih jauh dengan Trigger, mari kita buat terlebih dahulu, struktur table yang dibutuhkan.

Nama : Parisaktiana Fathonah NIM : Kelas : Prak Sistem Basis Data TI-2 B malam

Pertemuan VI F U N C T I O N

Praktikum Basis Data (Database Server MySQL) Bekerja Dengan Tabel

Gambar Layar pertama untuk pemecahan masalah Lost Update

Pengenalan Structured Query Language

MODUL VIII BASIS DATA TRANSACTION

IMPLEMENTASI CONCURENCY CONTROL UNTUK APLIKASI MULTIUSER MENGGUNAKAN DATABASE SQL SERVER. Wiwi Widayani STMIK AMIKOM Yogyakarta

Transaksi Semester Ganjil 2014 Fak. Teknik Jurusan Teknik Informatika. Caca E. Supriana, S.Si.,MT. Si

TUGAS PRAKTIKUM SISTEM BASIS DATA

Contoh SQL Constraint

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA LAB SHEET PEMROGRAMAN WEB Semester: 2 MYSQL 200 menit No.: Job: 12 Tgl: Hal.

SISTEM BASIS DATA 2. WAHYU PRATAMA, S.Kom., MMSI.

Pengertian. Mengapa SP? Mengapa SP? 07/05/2012 STORED PROCEDURE

Transaction dan Trigger. M. Saefudin SKom, MMSI

IMPLEMENTASI CONCURENCY CONTROL UNTUK APLIKASI MULTIUSER MENGGUNAKAN DATABASE SQL SERVER Wiwi Widayani

STORE PROCEDURE. Pemrograman Client Server Sarji, S.Kom Studi kasus pada

BAB IV IMPLEMENTASI DAN PENGUJIAN

PRAKTIKUM PL/SQL (Trigger) OLEH : WIRATMOKO YUWONO, ST

Agenda SQL. Pemakai SQL. Kemampuan SQL 02/12/2010 STRUCTURED QUERY LANGUAGE (SQL) Structured Query Language (SQL) (Pert. 9)

MODUL PEMPROGRAMAN SQL TINGKAT DASAR 1 STANDAR KOMPETENSI: MENERAPKAN BAHASA PEMPROGRAMAN SQL TINGKAT DASAR SMK NEGERI 1 MAJALENGKA

TUGAS I PRAKTIKUM SISTEM BASIS DATA. Nama: Krisna Pandu Wibowo( )

TUGAS PRAKTIKUM SISTEM BASIS DATA

Distributed System. 9 Concurrency Control. Genap 2011/2012. Dahlia Widhyaestoeti, S.Kom dahlia74march.wordpress.

MANAJEMEN TRANSAKSI. Alif Finandhita, S.Kom

Manajemen Transaksi. Sistem Basis Data. Gentisya Tri Mardiani, S.Kom

Praktikum Basis Data. By. Rita Wiryasaputra, ST., M. Cs.

LAPORAN TUGAS Pemrograman Berbasis Java

Basis Data II. Pertemuan Ke-9 dan ke-10 (Stored Procedure dan Trigger) Noor Ifada S1 T. Informatika - UTM (2012) 1

PERINTAH DASAR MySQL

MySQL Databases. Dasar-dasar MySQL dan Implementasi MySQL kedalam pemrograman PHP. Jakarta, 16 April 2011 Oleh: M. Awaludin, S.Kom

By Mrs Imana Malia Kondou, S.T. missimanakondou.wordpress.com

Distributed System. 8 Management Transaksi. Genap 2011/2012. Dahlia Widhyaestoeti, S.Kom dahlia74march.wordpress.

TRIGGER. Tujuan Mata Kuliah. Tools yang digunakan. Sesi7 : TRIGGER. Praktikum Pemrograman Client Server Database Hadi Kusumah, S.T.

Pertemuan 12 Pengenalan Structured Query Language

Praktikum Basis Data 14 Structure Query Language 2

Kontrak Kuliah. Dasar-dasar MySQL. Edi Sugiarto, S.Kom, M.Kom

Contoh 3.1: Membuat suatu store procedure supaya menghapus semua pertandingan pemain berdasarkan nomor pemain yang ditentukan.

BAB II PEMBUATAN DAN MANAJEMEN TABLE

Pengertian Query. Query adalah perintah-perintah untuk mengakses data pada sistem basis data

Praktikum Basis Data 2017 TE UM MODUL 8 TRIGGER A. TUJUAN

IMPLEMENTASI TRIGGER, STORED PROCEDURE, FUNCTION DAN VIEW PADA MYSQL DALAM PERANCANGAN SYSTEM INVENTORY CAFFE BOULEVARD JAYAPURA

Praktikum TRIGGER. Tujuan :

Kontrak Kuliah. Trigger dan Scheduled Events. Edi Sugiarto, S.Kom, M.Kom

STRUCTURE QUERY LANGUAGE (SQL)

MODUL 1 DATABASE MYSQL

VIEW : Tabel Virtual VIEW 5/29/2017

Modul 6 Function dan Trigger

Database Systems: Lab. Actvity 1: Database Design. Merancang Database. Merancang Database. Tipe Tabel MySQL.

KapitaSelekta. (KBKI82127, 2 sks) Materi : Pengenalan MySQL

MySQL AL AZHAR COMPUTER CLUB

BAB 4 IMPLEMENTASI DAN EVALUASI

MUKADDIMAH TEORI ASUMSI TABEL. CREATE TABLE contoh ( kode CHAR(5), nama VARCHAR(50) )

BAB V CURSOR AND RESULT SETS

Jobsheet SQL Dasar : Hari Zulianto, ST [Year]

PRAKTIKUM SISTEM BASIS DATA

PENGENALAN SINTAKS DASAR DALAM MySQL

TUGAS PRAKTIKUM SISTEM BASIS DATA

Basis Data Relational

Constraint dan Manajemen Data dalam Timezone Berbeda

Eksekusi file setup.exe yang ada dalam CD atau folder instalasi oracle.

Pertemuan I KONSEP DASAR STORED ROUTINES

Pemrograman Web Lanjut 2017

Mengenal MySQL Stored Procedure

Untuk menjalankan Mysql secara konpensional jalankan Mysql.exe pada direktori Mysql\Bin. Akan tampak tampilan sebagai berikut:

Pemrograman Web. Koneksi dan Manipulasi Basis Data. 7 Adam Hendra Brata

Membuat Function, Stored Procedur dan View pada MySQL

Database Systems: Lab. Actvity 3: Fungsi-Fungsi MySql Advance. Pendahuluan. Pendahuluan

LAMPIRAN A: DDL DATABASE

BAB VIII FUNGSI, PL/PGSQL dan TRIGER

Database Management System. Program yang memungkinkan item-item dalam suatu database disusun, diolah dan diperbaharui

Basis Data. DDL & Aturan Referential

Konsep Dasar. Relatsional dan RDBMS User dan Schema Database Membuat Tabel dan Mendefinisikan Constraint Input Data ke dalam Tabel

Contoh Aplika Aplik si a VB dengan Database Oracle 1

MODUL 4 INTERNET PROGRAMMING DATABASE

B a s i s D a t a - 1 C H A P T E R. SQL Operasi DML. Copyright 2005 PENS-ITS

PRAKTIKUM SISTEM BASISDATA

PRAKTIKUM SISTEM BASIS DATA. Tugas I. Disusun oleh: Yoga Asmara (TI/ )

sistem basis data ti ti ukdw Transaksi Budi Susanto Teknik Informatika Universitas Kristen Duta Wacana Yogyakarta 11/14/11 budi susanto 1

Basis Data. Bagian IV SQL (3) Fak. Teknik Jurusan Teknik Informatika Universitas Pasundan

MODUL 1. Pembuatan tabel, pendefinisian constraint, export dan import PRAKTIKUM BASIS DATA LANJUT TEKNIK PERANGKAT LUNAK UNIVERSITAS PGRI RONGGOLAWE

Transkripsi:

Pertemuan IX MANAJEMEN TRANSAKSI

TUJUAN 1. Mahasiswa mampu memahami arti dari transaksi 2. Mahasiswa mampu untuk menjelaskan dan memahami tentang proses AUTO COMMIT. 3. Mahasiswa mampu untuk memahami tentang START TRANSACTION, COMMIT dan ROLLBACK 4. Mahasiswa mampu untuk menerapkan konsep transaksi dalam store procedure untuk menginsertkan data. 5. Mahasiswa mampu untuk menerapkan konsep transaksi dalam store procedure untuk menghapus data.

Arti Transaksi Transaksi : serangkaian kelompok dari operasi manipulasi database yang dilakukan seolah-olah sebagai satu unit kerja secara individu Jika sebuah operasi di dalam transaksi gagal dijalankan, maka keseluruhan transaksi juga akan gagal dijalankan 4 properti standar yang dimiliki dari Transaksi pada MySQL : (ACID) Atomicity : memastikan bahwa seluruh operasi dalam unit kerja diselesaikan dengan baik. Jika tidak, transaksi akan dihentikan pada poin kegagalan dan operasi sebelumnya akan dibatalkan sehingga kembali ke keadaan semula. Consistency : memastikan bahwa database secara tepat mengubah keadaan transksi yang berhasil dijalankan dengan commit Isolation : memungkinkan transaksi untuk beroperasi secara independent Durability : memastikan bahwa hasil atau efek dari transaksi dapat bertahan apabila sistem mengalami kegagalan

Auto Commit, Start Transaction, Commit, Rollback Fasilitas penanganan kesalahan (error handling) biasa diperlukan untuk mengantisipasi terjadinya kesalahan pada suatu proses transaksi, sehingga programmer bisa mengatur skenario jika suatu operasi gagal sebagian atau seluruhnya. Secara default skenario dari transaksi adalah AUTO COMMIT. Artinya semua proses yang berhasil dilaksanakan akan secara otomatis secara fisik disimpan dalam database. Jika diinginkan mulai dari posisi tertentu AUTO COMMIT tidak berfungsi, dapat digunakan perintah START TRANSACTION. Selanjutnya sesuatu perintah sesudah pernyataan START TRANSACTION akan ditunda untuk disimpan, sampai bertemu pernyataan COMMIT yang akan menyimpan seluruh proses yang tertunda atau bertemu pernyataan ROLLBACK yang akan membatalkan seluruh proses yang tertunda.

Cont. Akan tetapi perlu diingat ada beberapa perintah yang tidak dapat di ROLL BACK karena mengandung fungsi COMMIT secara implisit. Perintah tersebut adalah : ALTER TABLE BEGIN CREATE INDEX CREATE TABLE CREATE DATABASE DROP DATABASE DROP INDEX DROP TABLE LOAD MASTER DATA LOCK TABLES SET AUTOCOMMIT = 1 START TRANSACTION TRUNCATE TABLE UNLOCK TABLES

Syntax START TRANSACTION BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 1} Keterangan: START TRANSACTION dan BEGIN : digunakan untuk memulai proses transaksi. COMMIT : untuk mengkomit transaksi tertentu, membuat segala perubahan secara permanen ROLLBACK : untuk membatalkan tranasksi. SET AUTOCOMMIT : untuk mengenable dan disable mode default autocommit untuk sebuah koneksi. Default untuk AUTOCOMMIT adalah enabled

Jenis Tabel MySQL Tidak semua jenis tabel MySQL mendukung transaksi. Yang mendukung transaksi : INNODB dan BDB

Contoh Mengimplementasikan Transaksi Sederhana create table test.trans(a int, b int) type = INNODB; begin; insert into trans(a,b) values(1,2); select * from trans; Rollback; Select * from trans;

Penggunaan FOR UPDATE Untuk Pengganti LOCK Table LOCK TABLE tidak dapat digunakan dalam store routine. LOCK TABLE hanya dapat digunakan di dalam aplikasi. Pernyataan LOCK TABLE dapat diganti dengan pernyataan FOR UPDATE. Jadi untuk penguncian baris data (record tertentu) pada tabel, digunakan SELECT.. FOR UPDATE, yang diawali dengan pernyataan START TRANSACTION Penguncian dengan FOR UPDATE akan berakhir secara eksplisit setelah transaksi dieksekusi.

Membuat Transaksi Eksplisit Sebuah transaksi yang dibentuk dengan menggunakan beberapa transaksi individu menjadi satu kesatuan dan menggunakan perintah eksplisit, yang tujuannya untuk memastikan bahwa seluruh operasi dalam unit kerja diselesaikan dengan baik

Transaksi Implisit DELIMITER $$ DROP PROCEDURE IF EXISTS `pbd`.`spcontohtransaksiimplisit`$$ CREATE PROCEDURE `pbd`.`spcontohtransaksiimplisit` (pkodespl varchar(20), pnofak varchar(30),ptglfak date, pkodebrg varchar(20), phargabeli decimal(10,0), pjumlah decimal(10,2)) BEGIN set max_error_count=0; set sql_notes=0;set AUTOcommit=0; start transaction; insert into beli(kodespl,nofak,tglfak,kodebrg,hargabeli,jumlah) values(pkodespl, pnofak, ptglfak, pkodebrg, phargabeli, pjumlah); COMMIT; update barang set stock=stock+pjumlah where kodebrg=pkodebrg; commit; END$$DELIMITER ;

Transaksi Eksplisit DELIMITER $$ DROP PROCEDURE IF EXISTS `pbd`.`spcontohtransaksieksplisit`$$ CREATE PROCEDURE `pbd`.`spcontohtransaksieksplisit` (pkodespl varchar(20), pnofak varchar(30),ptglfak date, pkodebrg varchar(20), phargabeli decimal(10,0), pjumlah decimal(10,2)) BEGIN set max_error_count=0; set sql_notes=0;set AUTOcommit=0; start transaction; insert into beli(kodespl,nofak,tglfak,kodebrg,hargabeli,jumlah) values(pkodespl, pnofak, ptglfak, pkodebrg, phargabeli, pjumlah); set @err=(select @@warning_count); if @err=0 then COMMIT; set @err=''; else ROLLBACK; set @err=''; end if; update barang set stock=stock+pjumlah where kodebrg=pkodebrg; set @err=(select @@warning_count); if @err=0 then commit; set @err=''; else ROLLBACK; set @err=''; end if; END$$DELIMITER ;

Permasalah Concurrency (Pengaksesan Data Secara Bersama) Ada 3 permasalah yang berhubungan dengan concurrency: Lost Update Problem uncommitted dependency problem Inconsistent analysis problem

Pemecahan Permasalah Tingkat Isolasi Transaksi : read-uncommitted, read-committed, repeatable-read dan serializable Jika kita menggunakan lebih dari 1 transaction-safe table, tetapi tidak menggunakan level isolasi SERIALIZABLE (misal repeatable-read) maka ketika satu transaksi diakhiri dengan COMMIT, transaksi lain yang sedang berlangsung daapt melihat perubahan transaksi yang dibuat oleh transaksi pertama. Ini akan membahayakan konsistensi dari sebuah transaksi. Jadi, untuk memastikan bahwa seluruh operasi dalam unit kerja diselesaikan dengan baik, jika menggunakan lebih dari 1 transaction-safe, setiap transaksi harus disertai dengan SET TRANSACTION ISOLATION LEVEL REPEATABLE SET [SESSION GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE}

Pemecahan Permasalah (cont) 1. Tingkat isolasi serializable 2. Autocommit dibuat disable 3. Operasi pembacaan data yang akan diikuti dengan operasi update data tersebut memberikan exclusive lock dengan cara memberikan perintah for update setelah perintah select.

Tabel Contoh transactions CREATE TABLE `transactions` ( `number` int(11) NOT NULL, `account` int(11) NOT NULL, `date` datetime NOT NULL, `balx` int(11) NOT NULL, `baly` int(11) NOT NULL, `balz` int(11) NOT NULL, PRIMARY KEY (`number`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Lost Update Problem transaksi T1 dieksekusi secara hampir bersamaan dengan transaksi T2, T1 melakukan debet sebesar 10 dari account dengan nilai balx = 100, sedangkan T2 melakukan kredit sebesar 100 pada account yang sama. Kedua transaksi ini dijalankan secara bersamaan yang menghasilkan ketidakkonsistenan data dengan nilai akhir account balx = 90. Jika kedua transaksi ini dieksekusi secara serial (satu setelah yang lain tanpa operasi yang tumpang tindih) akan menjaga konsistensi data dengan nilai akhir account balx = 190 mengabaikan transaksi yang mana yang dieksekusi lebih dulu.

Contoh SpNonLostUpdateProblem DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`spnonlostupdateproblem`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spnonlostupdateproblem`() BEGIN DECLARE balancex INTEGER DEFAULT 0; SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; SET AUTOCOMMIT=0; SELECT "Waiting..."; SELECT balx INTO balancex FROM test.transactions WHERE number=1 FOR UPDATE; SET balancex = balancex - 10; UPDATE test.transactions SET balx=balancex, date=now() WHERE number=1; COMMIT; END$$ DELIMITER ;

SpNonLostUpdateProblem2 DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`spnonlostupdateproblem2`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `spnonlostupdateproblem2`() BEGIN DECLARE balancex INT; DECLARE counter INT DEFAULT 0; SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION; SET AUTOCOMMIT=0; SELECT balx INTO balancex FROM test.transactions WHERE number=1 FOR UPDATE; SELECT "Waktu Tunda..."; WHILE counter < 1000000 DO SET counter = counter + 1; END WHILE; SET balancex = balancex + 100; UPDATE test.transactions SET balx=balancex, date=now() WHERE number=1; COMMIT; END$$ DELIMITER ;

Store Procedure dan Transaksi untuk Insert Data Sebagai contoh akan dibuat sebuah store procedure yang digunakan untuk menginsertkan sebuah transaksi pembelian ke tabel Beli. Pada saat proses transaksi beli terjadi akan mengupdate jumlah barang yang ada di tabel barang. Tetapi sebelum mengupdate stock barang pada tabel barang akan dicek terlebih dahulu apakah barang tersebut ada atau tidak di tabel barang, jika barang yang dibeli tidak ada di dalam tabel barang maka seluruh transaksi akan dibatalkan.

Store Procedure dan Transaksi untuk Insert Data Berikut struktur tabel barang dan tabel beli yang digunakan: CREATE TABLE `beli` ( `kodespl` varchar(20) default NULL, `nofak` varchar(30) default NULL, `TglFak` date default NULL, `KodeBrg` varchar(20) default NULL, `HargaBeli` decimal(10,0) default NULL, `Jumlah` decimal(10,0) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Store Procedure dan Transaksi untuk Insert Data CREATE TABLE `barang` ( `kodebrg` varchar(20) NOT NULL, `Nama` varchar(30) default NULL, `Satuan` varchar(20) default NULL, `HargaBeli` decimal(10,0) default NULL, `HargaJual` decimal(10,0) default NULL, `Stock` decimal(10,0) default NULL, PRIMARY KEY (`kodebrg`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Store Procedure dan Transaksi untuk Insert Data (cont) Data pada tabel Barang adalah sebagai berikut : Sedangkan data pada tabel Beli masih kosong :

Store Procedure dan Transaksi untuk Insert Data (cont) Procedur untuk menginsertkan data ke tabel Beli adalah sebagai berikut: DELIMITER $$ DROP PROCEDURE IF EXISTS `pbd`.`spinsertbeli`$$ CREATE PROCEDURE `pbd`.`spinsertbeli` (pkodespl varchar(20), pnofak varchar(30), ptglfak varchar(20), pkodebrg varchar(20), phargabeli numeric, pjumlah numeric)

Store Procedure dan Transaksi untuk Insert Data (cont) BEGIN START TRANSACTION; insert into Beli values(pkodespl,pnofak,ptglfak, pkodebrg,phargabeli,pjumlah); if exists(select * from Barang where kodebrg=pkodebrg) then UPDATE Barang set stock =if(isnull(stock),0,stock)+pjumlah where kodebrg = pkodebrg; COMMIT; else ROLLBACK; END IF; END$$ DELIMITER ;

Store Procedure dan Transaksi untuk Insert Data (cont) Dicoba untuk memanggil store procedure spinsertbeli : call spinsertbeli("aneka","001","2006-10- 30","BG.001",900,24); call spinsertbeli("aneka","001","2006-10- 30","PS.001",1200,60); call spinsertbeli("aneka","002","2006-10- 31","PS.002",1300,80); Pada perintah 1 dan 2 hasilnya akan tercatat ditabel Beli dan mengupdate tabel Barang, tetapi untuk transaksi yang ke -3 tidak tercatat di tabel Beli dan tidak mengupdate di tabel Barang

Store Procedure dan Transaksi untuk Insert Data (cont) Hasil di tabel Beli :

Store Procedure dan Transaksi untuk Insert Data (cont) Hasil pada tabel Barang :

Store Procedure dan Transaksi untuk Insert Data (cont) Jika tidak menggunakan perintah START TRANSACTION, ROLLBACK, COMMIT apa yang akan terjadi jika memasukan transaksi BELI tetapi barang yang dibeli belum ada di tabel Barang??? DELIMITER $$ DROP PROCEDURE IF EXISTS `pbd`.`spinsertbeli2`$$ CREATE PROCEDURE `pbd`.`spinsertbeli2` (pkodespl varchar(20),pnofak varchar(30), ptglfak varchar(20),pkodebrg varchar(20), phargabeli numeric, pjumlah numeric)

Store Procedure dan Transaksi untuk Insert Data (cont) BEGIN insert into Beli values(pkodespl,pnofak,ptglfak, pkodebrg,phargabeli,pjumlah); UPDATE Barang set stock=if(isnull(stock),0,stock)+pjumlah where kodebrg=pkodebrg; END$$ DELIMITER ;

Store Procedure dan Transaksi untuk Hapus Data Berikut ini akan dicoba untuk membuat store procedure untuk menghapus data. Store procedure akan menghapus data pembelian barang tertentu dari supplier tertentu. Selanjutnya stock yang ada di barang akan disesuaikan. Langkah terakhir adalah jika ternyata data barang pada pembelian sudah pernah diretur maka seluruh perintah akan dibatalkan. Artinya tidak mungkin akan menghapus data pembelian jika barang tersebut sudah pernah diretur.

Store Procedure dan Transaksi untuk Hapus Data (cont) Struktur tabel untuk RetBeli adalah sebagai berikut: CREATE TABLE `retbeli` ( `kodespl` varchar(20) default NULL, `NoRet` varchar(30) default NULL, `TglRet` date default NULL, `NoFak` varchar(30) default NULL, `TglFak` date default NULL, `KodeBrg` varchar(20) default NULL, `HargaBeli` decimal(10,0) default NULL, `Jumlah` decimal(10,0) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1

Store Procedure dan Transaksi untuk Hapus Data (cont) Tabel awal RetBeli adalah sebagai berikut:

Store Procedure dan Transaksi untuk Hapus Data (cont) Strore Procedure sphapusbeli adalah sebagai berikut: CREATE PROCEDURE `pbd`.`sphapusbeli` (pkodesp varchar(20), pnofak varchar(30),ptgfak varchar(20),pkodebrg varchar(20)) BEGIN declare vjumlah numeric; start transaction; select jumlah into vjumlah from Beli where kodespl=pkodesp and nofak=pnofak and TglFak=pTgFak and KodeBrg=pKodeBrg; delete from beli where kodespl=pkodesp and nofak=pnofak and TglFak=pTgFak and KodeBrg=pKodeBrg; update barang set stock = stock-vjumlah where kodebrg=pkodebrg; if exists(select * from retbeli where kodespl=pkodesp and nofak=pnofak and TglFak=pTgFak and KodeBrg=pKodeBrg) then rollback; else commit; end if;

Store Procedure dan Transaksi untuk Hapus Data (cont) Dicoba untuk memanggil store procedure sphapusbeli sbb: call sphapusbeli("aneka","001","2006-10- 30","BG.001"); call sphapusbeli("aneka","001","2006-10- 30","PS.001"); Pada perintah 1 akan berhasil menghapus data pada tabel Beli dan mengupdate stock di tabel barang. Sedangkan pada transaksi kedua tidak akan dilakukan proses penghapusan.