PRAGMA AUTONOMOUS_TRANSACTION


Autonomous transaction merupakan solusi dari masalah yang dihadapi Oracle yaitu semua session oracle hanya dapat menangani 1 transaksi dalam 1 waktu. Jika transaksi “A” dijalankan, maka tidak ada transaksi lain yang dapat berjalan sebelum transaksi “A” di commit atau di rollback. Dengan adanya fitur Autonomous transaction, transaksi “B” bisa dilakukan dengan seolah – olah men-suspend transaksi “A” dan melanjutkan kembali transaksi “A” setelah transaksi “B” selesai.
Dalam contoh di atas transaksi “A” bisa kita anggap sebagai main transaction dan transaksi “B” bisa kita anggap sebagai Autonomous transaction.
Autonomous transaction adalah transaksi yang dapat berjalan independent tanpa mempengaruhi atau dipengaruhi main transaction.
Keuntungan utama jika menggunakan Autonomous transaction adalah Autonomous transaction dapat dicommit atau di rollback tanpa mempengaruhi transaksi di main transaction.
Contoh :
Create table tabel_mahasiswa (NIM varchar2 (10) primary key,name varchar2 (20), nilai_TM Number,jurusan VARCHAR2 (20));
Insert into tabel_mahasiswa (NIM,name) values (‘1′,’user1′);
Insert into tabel_mahasiswa (NIM,name) values (‘2′,’user2′);
SELECT * FROM tabel_mahasiswa;
NIM NAME NILAI_TM JURUSAN
—- ——- ———— ———-
1 user1
2 user2

Lalu kita jalankan baris code berikut :

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR i IN 3 .. 5 LOOP
INSERT INTO tabel_mahasiswa (NIM, name)
VALUES (i, 'user' || i);
END LOOP;
COMMIT;
END;
/


SELECT * FROM tabel_mahasiswa;
NIM NAME NILAI_TM JURUSAN
—- ————– ———- ——–
1 user1
2 user2
3 user3
4 user4
5 user5

Lalu kita rollback



rollback;
SELECT * FROM tabel_mahasiswa;
NIM NAME NILAI_TM JURUSAN
—- ————– ———- ——–
6 user3
7 user4
8 user5

bisa kita lihat hasilnya bahwa data yang di-insert dalam autonomous transaction tidak terpengaruh rollback
Autonomous transaction biasa digunakan untuk logging/fungsi yang tetap dilakukan walaupun transaksi utamanya gagal. Untuk mendefinisikan block SQL sebagai autonomous transaction anda cukup mennggunakan PRAGMA AUTONOMOUS_TRANSACTION dalam block SQL yang hendak anda jadikan sebagai autonomous transaction.
Ada beberapa hal yang perlu diperhatikan dalam penggunaan PRAGMA AUTONOMOUS_TRANSACTION :
Jika anda hendak mendefinisikan sebuah anonymous block sebagai autonomous transaction, hanya level tertinggi yang dapat didefinisikan sebagai autonomous transaction.

Contoh :
Benar :

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
mhs_name VARCHAR2 (20);
BEGIN
mhs_name := ‘Willy’;
INSERT INTO tabel_mahasiswa (name) values (mhs_name);
COMMIT;
END;
/

Salah :

DECLARE
mhs_name VARCHAR2 (20);
BEGIN
– Ini adalah top level dalam anonymous block
DECLARE
– Ini bukan top level dalam anonymous block
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
mhs_name := ‘Willy’;
INSERT INTO tabel_mahasiswa (name) values (mhs_name);
COMMIT;
END;
END;
/

Hindari penggunaan resource yang digunakan di main transaction agar tidak menyebabkan deadlock

Contoh :

Create table tabel_mahasiswa (NIM varchar2 (10) primary key,name varchar2 (20), nilai_TM Number,jurusan VARCHAR2 (20));
CREATE OR REPLACE PROCEDURE update_Nilai (jurusan_ IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
CURSOR mahasiswa IS
SELECT NIM FROM tabel_mahasiswa
WHERE jurusan = jurusan_
FOR UPDATE NOWAIT;
BEGIN
FOR data_mahasiswa IN mahasiswa
LOOP
UPDATE tabel_mahasiswa SET nilai_TM = 85
WHERE NIM = data_mahasiswa.NIM;
END LOOP;
COMMIT;
END;
/
BEGIN
–-Ini adalah main procedure
UPDATE tabel_mahasiswa SET name = ‘Willy’ where NIM = ‘123456′ and jurusan = ‘FASILKOM’;
update_Nilai (’FASILKOM’);
END;
/

Akan mengakibatkan deadlock karena procedure update_nilai berusaha mengakses data/resource yang masih di-hold oleh main procedure sehingga oracle akan memberikan error

ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

Package tidak dapat dideklarasikan sebagai autonomous transaction dengan 1 pragma saja.
Contoh :
Salah :

CREATE OR REPLACE package pkg_1 as
PRAGMA AUTONOMOUS_TRANSACTION;
PROCEDURE proc_1;
PROCEDURE proc_2;
END;
/

Benar :

CREATE OR REPLACE package pkg_1 as
PROCEDURE proc_1 IS PRAGMA AUTONOMOUS_TRANSACTION;
PROCEDURE proc_2 IS PRAGMA AUTONOMOUS_TRANSACTION;
END;
/

Setiap anonymous transaction harus diakhiri dengan perintah commit atau rollback jika tidak maka akan mendapat error ORA-6519.
Contoh :

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO tabel_mahasiswa (name) values (‘Willy’);
END;
/

Jika terjadi unhandled error di dalam autonomous transaction maka rollback akan dijalankan
Contoh :

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
Var_1 NUMBER;
BEGIN
INSERT INTO tabel_mahasiswa (name) values (‘Willy’);
Var_1 = ‘xxx’; — numeric or value Error
END;
/

Dalam contoh di atas, data ‘Willy’ tidak akan ter-insert ke tabel_mahasiswa karena error yang terjadi di baris Var_1 = ‘xxx’ akan mengakibatkan rollback. Untuk mengatasinya bisa digunakan code Sebagai berikut :

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
Var_1 NUMBER;
BEGIN
INSERT INTO tabel_mahasiswa (name) values (‘Willy’);
Var_1 = ‘xxx’; — numeric or value Error
EXCEPTION
WHEN value_error THEN
Commit;
END;
/

Atau

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
Var_1 NUMBER;
BEGIN
INSERT INTO tabel_mahasiswa (name) values (‘Willy’);
Var_1 = ‘xxx’; — numeric or value Error
EXCEPTION
WHEN others THEN
Commit;
END;
/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s