Pengubahan, penambahan, penghapusan suatu tabel biasanya berdampak pada isi tabel satu dengan lainnya. Jika perubahan tabel satu dengan lainnya yang terkait, terjadi kagagalan, maka terjadi ketidakkonsistenan integrasi antar tabel.

MySQL mendukung manajemen transaksi dengan syarat pada saat menciptakan tabel menggunakan mesin penyimpanan InnoDB.

Pertama, yang kita bahas konsep dari level isolasi dan sesi

Level Isolasi

Sebelum kita berbicara transaksi dan level kelompok, kita perlu untuk jelaskan konsep dari suatu sesi. Suatu sesi database adalah suatu koneksi yang unik database yang memulai ketika anda login ke MySQL dan mengakhiri koneksi, dengan tegas ketika MySQL menberikan pesa bahwa program klien yang anda pakai terputus

Tingkat isolasi suatu transaksi juga menentukan derajat tingkat bagi yang transaksi menenpati ACID yang akan uraikan dibagian ini. Masing-Masing dari empat tingkatan isolasi menghadirkan suatu keseimbangan yang berbeda antar isolasi dan concurrency dari transaksi. Di level isolasi yang paling tinggi, seluruh transaksi akan mampu melaksanakan secara bersamaan,.

READ UNCOMMITTED

Ini adalah tingkatan isolasi yang mungkin paling rendah. Kadang-kadang memanggil dirty read, tingkatan ini mengijinkan suatu transaksi membabaca rekaman yang belum di commit. Penggunaan tingkatan isolasi ini mungkin meningkatkan keberhasilan hanya satu pemakai yang mendapat kembali data yang diubah oleh pemakai lain..

READ COMMITTED

Pada tingkatan isolasi ini, rekaman hanya dapat dilihat oleh suatu transaksi. Lagi pula, statemen hingga batas tertentu perubahan apapun yang dilakukan memulai eksekusi tidak bisa dilihat. Sebagai contoh, jika anda menjalankan perintah SELECT Suatu yang query dari tabel BUKU, dan sesi B memasukkan suatu baris ke dalam BUKU sedangkan suatu query masih menjalankan, baris yang baru itu tidak akan terlihat oleh perintah SELECT

REPEATABLE READ
Pada level isolasi ini tidak ada perubahan bagi database yang dibuat oleh lain sesi karena transaksi dapat dimulai dilihat di dalam transaksi, sampai transaksi dilakukan atau loop mundur atau ROLLBACK (pembatalan) jika Anda menjalankan ulang SELECT di dalam transaksi , akan selalu menunjukkan yang sama menghasilkan.

SERIALIZABLE
Pada tingkat isolasi, tiap-tiap transaksi dengan sepenuhnya terisolasi sedemikian rupa sehingga transaksi bertindak seolah-olah mereka telah mengeksekusi berturutan, satu demi satu; berturut-turut. Dalam rangka mencapai ini, RDBMS akan secara khusus mengunci tiap-tiap baris yang dibaca, maka lain sesi tidak boleh memodifikasi data itu sampai transaksi telah selesai dengan itu. Kunci dilepaskan ketika Anda melakukan atau batalkan transaksi

Bentuk Umum perintah tansakasi :

SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED
|REPEATABLE READ | SERIALIZABLE}

Perintah Manajemen Transaction

MySQL menggunakan yang berikut statemen manajemen transaksi :

START TRANSACTION
Marupakan awal dari blok perintah untuk melakukan transakasi

COMMIT
Melakukan perubahan atau secara fisik pada tebal

ROLLBACK
Perintah ini jika dijalankan suatu perubahan secara keseluruhan dalam blok transakasi dibatalakn.

SAVEPOINT savepoint_name
Menciptakan suatu savepoint yang dinamai identifier bahwa dapat target dari suatu ROLLBACK KE SAVEPOINT statemen.

ROLLBACK TO SAVEPOINT savepoint_name
Melaksanakan suatu rollback semua statemen yang telah dieksekusi sejak ditetapkan savepoint telah diciptakan. Dengan cara ini, kamu dapat mengulang mundur hanya bagian dari suatu transaksi, memelihara beberapa subset dari perubahan untuk tetap diselamatkan.

SET TRANSACTION
Ijinkan kamu untuk memilih level pengasingan terhadap transaksi. Secara detail terdapat pada bagian Level isolasi.

LOCK TABLES
Dengan tegas mengunci satu atau lebih tabel. Dicatat bahwa LOCK TABLES secara implisit menutup manapun transaksi yang sekarang ini terbuka. Kita merekomendasikan bahwa kamu dengan tegas melakukan atau loop ulang transaksi sebelum LOACK TABLES statemen apapun.

Contoh
Transakasi Menggunakan SET AUTOCOMMIT dalam Procedure

CREATE PROCEDURE tfer_funds
(from_account int, to_account int,tfer_amount numeric(10,2))
BEGIN
SET autocommit=0;
UPDATE account_balance
SET balance=balance-tfer_amount
WHERE account_id=from_account;
UPDATE account_balance
SET balance=balance+tfer_amount
WHERE account_id=to_account;
COMMIT;
END;

Transaksi menggunakan START TRANSACTION, dalam Procedure

CREATE PROCEDURE tfer_funds
(from_account int, to_account int,tfer_amount numeric(10,2))
BEGIN
START TRANSACTION;
UPDATE account_balance
SET balance=balance-tfer_amount
WHERE account_id=from_account;
UPDATE account_balance
SET balance=balance+tfer_amount
WHERE account_id=to_account;
COMMIT;
END;

Seperti kita ketahui transaksi secara normal melengkapi, menjalankan perintah COMMIT maupun ROLLBACK statemen dieksekusi. Bagaimanapun, kita sadar bahwa beberapa statemen Data Definition Language ( DDL) mencari perintah menyebabkan COMMIT. Statemen yang secara implisit dilakukan, dan oleh karena itu dihindarkan ketika suatu transaksi barjalan, jika sedang menjalankan perintah berikut :

ALTER FUNCTION
ALTER PROCEDURE
ALTER TABLE
BEGIN
CREATE DATABASE
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP TABLE
UNLOCK TABLES
LOAD MASTER DATA
LOCK TABLES
RENAME TABLE
TRUNCATE TABLE
SET AUTOCOMMIT=1
START TRANSACTION

PRAKTIK


CREATE TABLE mhs (
no_mhs char(4) DEFAULT NULL,
nama char(25) DEFAULT NULL,
alamat char(25) DEFAULT NULL
) ENGINE=InnoDB

CREATE TABLE `jurusan` (
`no_mhs` char(4) DEFAULT NULL,
`kode` char(2) DEFAULT NULL
) ENGINE=InnoDB;

Transaksi penambahan reakaman menggunakan START TRANSACTION dan ROLLBACK; satu rekaman
– Jalankan perintah transakasi


mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

– Penambahan rekama tabel mhs

mysql> INSERT INTO mhs VALUES(’0005′,’Untung Raharja’,'Bandung’);
Query OK, 1 row affected (0.00 sec)

– Lihat hasil penambahan

mysql> select * from mhs;
+--------+----------------+--------+
| no_mhs | nama | alamat |
+--------+----------------+--------+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung|
+--------+----------------+--------+
5 rows in set (0.00 sec)

– penjalesan
– Mahasiswa untuk sumentara sudah direkam
– Mambatalkan rekaman dengan perintah ROLLBACK;


mysql> ROLLBACK;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from mhs;
+——–+——+——–+
| no_mhs | nama | alamat |
+——–+——+——–+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
+——–+——+——–+
4 rows in set (0.00 sec)

– Cek kembali mahasiswa bernama Untung tidak jadi direkam

Mari kita coba lagi penambahan lebih dari 1 rekamanan dengan blok transakasi

Penambahan rekaman dengan START TRANSACTION dan ROLLBACK dua rekaman

mysql> START TRANSACTION;
mysql> INSERT INTO mhs VALUES(’0005′,’Untung Raharja’,’Bandung’);
mysql> INSERT INTO mhs VALUES(’0006′,’Diah Ayu Subekti’,’Semarang’);

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.05 sec)

// lihat hasilnya

mysql> select * from mhs;
+——–+——+——–+
| no_mhs | nama | alamat |
+——–+——+——–+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
+——–+——+——–+
4 rows in set (0.00 sec)

mysql>

Penjelasan :

Telah ditambahkan 2 rekaman

| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |

Kemudian pada saat menjalan perintah ROLLBACK
2 Rekaman tersebut dibatalkankan semua

Penambahan rekaman dengan START TRANSACTION dan COMMIT dua rekaman atau lebih

Perintah COMMIT, lihat contoh berikut :

mysql> START TRANSACTION;
mysql> INSERT INTO mhs VALUES(’0005′,’Untung Raharja’,’Bandung’);
mysql> INSERT INTO mhs VALUES(’0006′,’Diah Ayu Subekti’,’Semarang’)
mysql> COMMIT;
Query OK, 0 rows affected (0.06 sec)

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

Penjelasan :
START TRANSACTION; : blok awal melakukan perintah transakasi
Perintah : ISNERT, UPDATE, DELETE
COMMIT; : perintah betul-betul dilakukan secara fisik ke penyimpan

Pengubahan dengan rekaman START TRANSACTION dan ROLLBACK

mysql> START TRANSACTION;
mysql> UPDATE mhs SET nama=’Agus Nefo’,alamat=’Pati’ WHERE no_mhs=’000

– lihat perubhan Agus namanya di ubah Agus Nefo, alamat Pati

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus Nefo | Pati |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

– batalkan perubahan

mysql> ROLLBACK;

– lihat kembali hasilnya, setelah dibatalkan kembali nama dan alamat semula.

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus | Solo |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

Contoh berikutnya :

Pengubahan dengan START TRANSACTION dan COMMIT

mysql> START TRANSACTION;
mysql> UPDATE mhs SET nama=’Agus Nefo’,alamat=’Pati’ WHERE no_mhs=’0001′;
mysql> COMMIT;

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus Nefo | Pati |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

mysql>
Perintah COMMIT akan benar-benar mengubah rekaman mhs.

Transaksi Penghapusan START TRANSACTION dan ROLLBACK

mysql> START TRANSACTION;
mysql> DELETE FROM mhs WHERE no_mhs=’0002′;
mysql> DELETE FROM mhs WHERE no_mhs=’0003′;

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus Nefo | Pati |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
4 rows in set (0.00 sec)

mysql> ROLLBACK;

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus Nefo | Pati |
| 0002 | Budi | jogja |
| 0003 | Bejo | Bantul |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
6 rows in set (0.00 sec)

Perintah ROLLBACK membatalkan penghapusan

Melakukan penghapusan START TRANSACTION dan COMMIT

mysql> START TRANSACTION;
mysql> DELETE FROM mhs WHERE no_mhs=’0002′;
mysql> DELETE FROM mhs WHERE no_mhs=’0003′;
mysql> COMMIT;
Query OK, 0 rows affected (0.06 sec)

// lihat penghapusan beer-benar dilakukan

mysql> select * from mhs;
+——–+——————+———-+
| no_mhs | nama | alamat |
+——–+——————+———-+
| 0001 | Agus Nefo | Pati |
| 0004 | Ani | jogja |
| 0005 | Untung Raharja | Bandung |
| 0006 | Diah Ayu Subekti | Semarang |
+——–+——————+———-+
4 rows in set (0.00 sec)

mysql>

Transaksi dari satu tabel

mysql> START TRANSACTION;
mysql> INSERT INTO mhs VALUES(’0002′,’Badiyanto’,’Yogyakarta’);

mysql> INSERT INTO jurusan(’0002′,’TI’);
mysql> INSERT INTO jurusan VALUES(’0002′,’TI’);

mysql> select * from mhs,jurusan WHERE mhs.no_mhs=jurusan.no_mhs;
+——–+———–+————+——–+——+
| no_mhs | nama | alamat | no_mhs | kode |
+——–+———–+————+——–+——+
| 0001 | Agus Nefo | Pati | 0001 | TI |
| 0004 | Ani | jogja | 0004 | KA |
| 0002 | Badiyanto | Yogyakarta | 0002 | TI |
+——–+———–+————+——–+——+
3 rows in set (0.00 sec)

mysql> ROLLBACK;

mysql> select * from mhs,jurusan WHERE mhs.no_mhs=jurusan.no_mhs;
+——–+———–+——–+——–+——+
| no_mhs | nama | alamat | no_mhs | kode |
+——–+———–+——–+——–+——+
| 0001 | Agus Nefo | Pati | 0001 | TI |
| 0004 | Ani | jogja | 0004 | KA |
+——–+———–+——–+——–+——+
2 rows in set (0.00 sec)

 

No related posts.