Tuesday 10 November 2015

InnoDB dan Transaksi MySQL



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

Repositori Institusional Di Perguruan Tinggi

Oleh : Riki Nuryadin riki.nuryadin@upi.edu riki.nuryadin@gmail.com Abstrak: Institusional repositori adalah sebuah wadah o...