basis data(transaction)

Transaction
• Transaction adalah sekumpulan perintah query yang terintegrasi
sebagai satu kesatuan proses.
• Sebuah transaction dinyatakan berhasil jika seluruh perintah
berjalan secara lengkap dan benar. Jika ada salah satu bagian
proses saja yang gagal, maka transaction tersebut juga secara
keseluruhan dinyatakan gagal.
• Menggunakan perintah commit atau rollback untuk mengeksekusi
atau membatalkan transaction.
• Menggunakan mode autocommit untuk mengatur apakah setiap
perintah query secara langsung di-commit.
1
Commit & Rollback
• SELECT * FROM PEGAWAI;
NIP NamaPegawai
111 David Iskandar
112 Reza Hermawan
• START TRANSACTION;
INSERT INTO PEGAWAI
VALUES (‘114’, ‘Arif Kurniawan’);
INSERT INTO PEGAWAI
VALUES (‘115’, ‘Hidayat Setiadi’);
COMMIT;
• SELECT * FROM PEGAWAI;
113 Aulia Rahman
• START TRANSACTION;
INSERT INTO PEGAWAI
VALUES (‘116’, ‘Erwin Wijaya’);
INSERT INTO PEGAWAI
VALUES (‘117’, ‘Sandiawan ’);
ROLLBACK;
• SELECT * FROMPEGAWAI
2
NIP NamaPegawai
111 David Iskandar
112 Reza Hermawan
113 Aulia Rahman
114 Arif Kurniawan
115 Hidayat Setiadi
FROM PEGAWAI
NIP NamaPegawai
111 David Iskandar
112 Reza Hermawan
113 Aulia Rahman
114 Arif Kurniawan
115 Hidayat Setiadi
Autocommit
• Mode autocommit :
􀂃 set autocommit = 1
􀃆 autocommit on
􀃆 setiap perintah query langsung di-commit
􀂃 set autocommit = 0
􀃆 autocommit off
􀃆 setiap perintah query tidak langsung di-commit
• Beberapa perintah query secara otomatis mengaktifkan mode
i h d b i d d bl d b
3
autocommit on, contoh : create database, create index, drop table, dsb.
Jika sudah dijalankan, maka perintah-perintah tsb tidak dapat
dibatalkan.
• Di awal transaction, mode autocommit secara otomatis di-off-kan
Locking
• Locking adalah sarana untuk mengatur penguncian data, terutama
dalam kaitan dengan proses concurrency (pengaksesan data secara
bersamaan oleh beberapa user).
• Mode lock tables :
􀂃 LOCK TABLES … nama_tabel… WRITE
􀃆 tabel dikunci dari operasi insert, update, delete, dan select
􀂃 LOCK TABLES … nama_tabel… READ
􀃆 tabel dikunci dari operasi insert, update, delete, tapi operasi select diperbolehkan
4
• Beberapa perintah query secara otomatis mengaktifkan mode locking,
yaitu : update, insert, select … for update, select … lock in share mode
• Untuk mengakhiri proses lock tables, digunakan perintah unlock tables
Deadlock
• Deadlock adalah suatu keadaan yang mengakibatkan dua buah
transaction saling menunggu data-data yang terkunci.
• Sebagai contoh, dua buah transaksi berikut yang dilakukan dalam
waktu yang bersamaan dapat menimbulkan deadlock :
– Nasabah A mentransfer dana $1000 ke rekening B
– Nasabah B mentransfer dana $2000 ke rekening A
#‐‐ Transfer dari nasabah A
START TRANSACTION;
# Kurangi saldo rekening A
#‐‐ Transfer dari nasabah B
START TRANSACTION;
# Kurangi saldo rekening B
5
#‐‐ UPDATE rekening
SET saldo = saldo – 1000
WHERE idrekening = ‘A’ ;
#‐‐ Tambahkan ke rekening B
UPDATE rekening
SET saldo = saldo + 1000
WHERE idrekening = ‘B’ ;
COMMIT;
#‐‐ UPDATE rekening
SET saldo = saldo – 2000
WHERE idrekening = ‘B’ ;
#‐‐ Tambahkan ke rekening A
UPDATE rekening
SET saldo = saldo + 2000
WHERE idrekening = ‘A’ ;
COMMIT;
Transaction & Store Procedure
• Transaction dapat diwujudkan dalam sebuah store procedure.
• Berikut ini adalah store procedure berisi transaksi transfer antar dua nasabah
(slide hal.5) yang telah dilengkapi dengan penanganan masalah deadlock dan
validasi data rekening asal, rekening tujuan, dan nilai transfernya :
CREATE PROCEDURE TransferDana
(rek_asal IN CHAR, rek_tujuan IN CHAR, nilai_tsf IN INTEGER)
IS
jmlrek INTEGER;
jmlsaldo INTEGER;
BEGIN
#‐‐ Solusi jika terjadi deadlock
DECLARE EXIT HANDLER FOR SQLSTATE ‘40001’
BEGIN
ROLLBACK;
dbms_output.put_line(“Transaksi batal karena deadlock”);
END;
main :
BEGIN
#‐‐ Validasi rek_asal, rek_tujuan, nilai_tsf
SELECT COUNT (idrekening) INTO jmlrek FROM rekening WHERE idrekening = rek_asal;
IF jmlrek = 0 THEN dbms output put line(“No rekening asal tidak ada”);
6
dbms_output.put_line( No.ada );
LEAVE main;
SELECT COUNT (idrekening) INTO jmlrek FROM rekening WHERE idrekening = rek_tujuan;
IF jmlrek = 0 THEN dbms_output.put_line(“No.rekening tujuan tidak ada”);
LEAVE main;
SELECT saldo INTO jmlrsaldo FROM rekening WHERE idrekening = rek_asal FOR UPDATE;
IF jmlsaldo < nilai_tsf THEN dbms_output.put_line(“Saldo rekening tidak cukup”);
LEAVE main;
START TRANSACTION;
#‐‐ Kurangi saldo rek_asal & tambahkan ke saldo rek_tujuan
UPDATE rekening SET saldo = saldo – nilai_tsf WHERE idrekening = rek_asal;
UPDATE rekening SET saldo = saldo + nilai_tsf WHERE idrekening = rek_tujuan;
COMMIT;
END;
END;

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