MySQl menyediakan berbagai jenis mesin penyimpan, yang akan menentukan
bagaimana sesungguhnya suatu table disimpan. Secara bawan tipe yang dipakai
untuk table dalah MyISAM, meskipun demikian ada jenis mesin penyimpan lain yang
di dukung oleh MySQL antara lain Memory (Heap),
RDB (BarkeleyDB) dan InnoDB.
InnoDB memiliki keistimewaan
mendukung transaksi, meskipun demikian memiliki beberapa kelemahan, antara lain
kinerja yang lebih lambat dari MyISAM, bila anda tidak akan menggunakan transaksi,
akan lebih baik jika membuat table menggunakan MyISAM, sebagai contoh dalam
proses menghitung semacam SELECT COUNT(*) FROM table akan berjalan lebih lama
dari MyISAM
Untuk lebih memahaminya mari kita
buat uji coba seperti dibawah ini :
Membuat Table bertipe InnoDB
Use test
Create table stock (
Kode_brg CHAR (5) NOT NULL
PRIMARY KEY,
Nama_brg CHAR (35) NOT NULL,
Jumlah INT) ENGINE=InnoDB;
Contoh Transaksi
Sebuah transaksi adalah sederetan
operasi yang berkedudukan sebagai suatu kesatuan proses, dalam proses terdapat
dua hal yang mesti dipenuhi, yaitu:
1. Transaksi
dianggap berhasil jika semua proses berjalan dengan lancer
2. Transaksi
dianggap gagal kalau salah satu bagian proses gagal
Secara default setiap klien MySQL
yang melakukan koneksi ke MySQL server menggunakan mode AUTOCOMMIT, yang
berarti setiap perintah SQL secara otomatis akan mengalami proses COMMIT,
COMMIT sendiri berarti menyetujui perintah untuk segera memutakhirkan database,
untuk mematikan AUTOCOMMIT dapat dilakukan dengan men set AUTOCOMMIT=0, berikut
adalah contoh nya :
mysql> INSERT INTO stock
-> values('K-001','Kertas
Papperline','10');
Query OK, 1 row affected (0.04 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM stock;
+----------+-------------------+--------+
| Kode_brg | Nama_brg | Jumlah |
+----------+-------------------+--------+
| K-001 |
Kertas Papperline | 10 |
+----------+-------------------+--------+
1 row in set (0.00 sec)
Kita lihat perbedaaan nya dengan
mengatur AUTOCOMMIT menjadi 0
mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO stock
->
VALUES ('K-002','Kertas Sinar Dunia','10');
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> ROLLBACK;
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT * FROM stock;
+----------+-------------------+--------+
| Kode_brg | Nama_brg | Jumlah |
+----------+-------------------+--------+
| K-001 |
Kertas Papperline | 10 |
+----------+-------------------+--------+
1 row in set (0.00 sec)
mysql>
Dengan menggunakan fitur AUTOCOMMIT yang dimatikan
(=0) memungkinkan MySQL untuk membatalkan perintah INSERT dengan menggunakan perintah ROLLBACK sehingga
barang dengan kode K-002 tidak jadi dimasukan kedalam table
Berikut adalah contoh penggunaan efek START dan
COMMIT Transaksi secara keseluruhan
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO stock
->
VALUES ('P-001','Pensil STADLER','15');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO stock
->
VALUES ('P-002','Faber Castell','10');
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.03 sec)
mysql> select * FROM stock;
+----------+-------------------+--------+
| Kode_brg | Nama_brg | Jumlah |
+----------+-------------------+--------+
| K-001 |
Kertas Papperline | 10 |
| P-001 |
Pensil STADLER | 15 |
| P-002 |
Faber Castell | 10 |
+----------+-------------------+--------+
3 rows in set (0.00 sec)
Pada lingkungan multi user, akses terhadap database
dilakukan oleh sejumlah orang. Pada keadaan seperti ini, muncul sejumlah
masalah yang mungkin terjadi, berikut adalah beberapa contoh permasalahan yang
mungkin terjadi :
·
Pemutakhiran yang hilang (lost update)
·
Pembacaan kotor (dirty read)
·
Pembacaan yang tidak sama (non-repetable read)
·
Penyisipan yang tidak dikehendaki (phantom insert)
Transaksi
dan Prosedur Tersimpan
Transaksi seringkali di wujudkan dalam bentuk
prosedur tersimpan, contohnya dapat dilihat pada penjelasan dibawah ini :
mysql> CREATE TABLE rekening (
->
no_rekening char(1) PRIMARY KEY NOT NULL,
->
saldo BIGINT);
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO rekening VALUES
('A',2000000);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO rekening VALUES
('B',4000000);
Query OK, 1 row affected (0.00 sec)
mysql> select * FROM rekening;
+-------------+---------+
| no_rekening | saldo |
+-------------+---------+
| A
| 2000000 |
| B
| 4000000 |
+-------------+---------+
2 rows in set (0.00 sec)
mysql> Delimiter //
mysql> CREATE PROCEDURE pindahbuku (
->
rek_asal CHAR, rek_tujuan CHAR,
->
nilai_transfer BIGINT)
->
BEGIN
->
START TRANSACTION;
->
UPDATE rekening
-> SET
saldo= saldo - nilai_transfer
->
WHERE no_rekening = rek_asal;
->
UPDATE rekening
-> SET
saldo = saldo + nilai_transfer
->
WHERE no_rekening = rek_tujuan;
->
COMMIT;
->
END;
-> //
Query OK, 0 rows affected (0.05 sec)
mysql> Delimiter ;
mysql> call pindahbuku ('A','B', 150000);
Query OK, 0 rows affected (0.01 sec)
Proses diatas adalah transaksi pemindah bukuan dari
rekening A ke rekening B senilai 150000, ini artinya aka nada pengurangan nilai
saldo di rekening A dan penambahan nilai saldo di rekening B, berikut ini
adalah hasil nya :
mysql> select * FROM rekening;
+-------------+---------+
| no_rekening | saldo |
+-------------+---------+
| A
| 1850000 |
| B
| 4150000 |
+-------------+---------+
2 rows in set (0.00 sec)
No comments:
Post a Comment