Interaksi PL/SQL dengan Oracle

6.9. Melakukan Unit-unit Pekerjaan Independen dengan Autonomous Transactions

Transaksi merupakan kumpulan perintah-perintah SQL yang melakukan unit pekerjaan logikal. Seringkali, satu transaksi memulai transaksi lain. Dalam beberapa aplikasi, sebuah transaksi harus beroperasi diluar jangkauan dari transaksi yang memulainya. Hal ini dapat terjadi, sebagai contoh, ketika sebuah transaksi memanggil kepada data cartridge.

Sebuah autonomous transaction merupakan transaksi independen yang dimulai oleh transaksi lain, yaitu main transaction. Autonomous transactions mengijinkan kita untuk menunda main transaction, melakukan operasi-operasi SQL, melakukan commit atau rollback operasi-operasi tersebut, kemudian melanjutkan kembali main transaction. Gambar 6-1 menunjukkan bagaimana mengontrol aliran dari main transaction (MT) ke autonomous transaction (AT) dan kembali lagi.

Gambar 6-1 Transaction Control Flow

6.9.1. Keuntungan dari Autonomous Transactions

Sekali dimulai, sebuah autonomous transaction independen secara penuh. Ia tidak berbagi penguncian-penguncian, sumberdaya, atau ketergantungan-commit dengan main transaction. Jadi, kita dapat mencatat kejadian-kejadian, menambahkan retry counters, dan seterusnya, bahkan jika main transaction di-rollback.

Lebih penting lagi, autonomous transactions membantu kita membangun komponen-komponen software yang modular dan dapat digunakan kembali. Sebagai contoh, stored procedures dapat memulai dan mengakhiri autonomous transactions pada kepemilikannya sendiri.   Aplikasi pemanggil perlu tahu tentang autonomous transactions milik procedure tersebut, dan procedure tersebut perlu tahu tentang transaction context dari aplikasi tersebut. Hal ini membuat autonomous transactions lebih sedikit error dibandingkan transaksi-transaksi biasa dan lebih mudah digunakan.

Selanjutnya, autonomous transactions memiliki seluruh fungsionalitas dari transaksi-transaksi biasa. Mereka mengijinkan query-query paralel, pemrosesan terdistribusi, dan seluruh perintah-perintah pengontrol transaksi termasuk SET TRANSACTION.

6.9.2. Mendefinisikan Autonomous Transactions

Untuk mendefinisikan autonomous transactions, kita menggunakan pragma (compiler directive) AUTONOMOUS_TRANSACTION. Pragma tersebut menginstruksikan PL/SQL compiler untuk menandai sebuai routine sebagai autonomous (independent). Dalam konteks ini, istilah routine termasuk

  • Blok-blok PL/SQL tak bernama berlevel top (tidak bersarang)
  • Procedure-procedure dan function-function lokal, berdiri sendiri dan ter-package
  • Methods dari tipe objek SQL
  • Database triggers

Kita dapat mengkodekan pragma dimanapun dalam bagian deklaratif dari sebuah routine. Namun, untuk kemudahan pembacaan, kita mengkodekan pragma pada bagian atas dari section tersebut. Sintaksnya adalah:

PRAGMA AUTONOMOUS_TRANSACTION;

Dalam contoh berikut ini, kita menandai function ter-package sebagai autonomous:

CREATE PACKAGE banking AS
  ...
  FUNCTION balance (acct_id INTEGER) RETURN REAL;
END banking;
CREATE PACKAGE BODY banking AS
  ...
  FUNCTION balance (acct_id INTEGER) RETURN REAL IS
  PRAGMA AUTONOMOUS_TRANSACTION;
  my_bal REAL;
BEGIN
  ...
END;
END banking;

Batasan: Kita tidak dapat menggunakan pragma untuk menandai seluruh subprogram dalam sebuah package (atau seluruh method dalam sebuah object type) sebagai autonomous. Hanya rutin-rutin individual saja yang dapat ditandai sebagai autonomous. Sebagai contoh, pragma berikut ini tidak diperbolehkan:

CREATE PACKAGE banking AS
  PRAGMA AUTONOMOUS_TRANSACTION; -- tidak diperbolehkan
  ...
  FUNCTION balance (acct_id INTEGER) RETURN REAL;
END banking;

Dalam contoh berikutnya, kita menandai standalone procedure sebagai autonomous:

CREATE PROCEDURE close_account (acct_id INTEGER, OUT balance) AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  my_bal REAL;
BEGIN   ...
END;

Dalam contoh berikutnya, kita menandai blok PL/SQL sebagai autonomous:

DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  my_empno NUMBER(4);
BEGIN   ...
END;

Batasan: Kita tidak dapat menandai blok PL/SQL bersarang sebagai autonomous.

Dalam contoh di bawah ini, kita menandai database trigger sebagai autonomous. Tidak seperti trigger pada umumnya, autonomous triggers dapat mengandung perintah-perintah pengontrol transaksi seperti COMMIT dan ROLLBACK.

CREATE TRIGGER parts_trigger
BEFORE INSERT ON parts FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO parts_log VALUES(:new.pnum, :new.pname);
  COMMIT; -- diperbolehkan hanya pada autonomous triggers
END;

6.9.2.1. Autonomous Versus Nested Transactions

Meskipun sebuah autonomous transaction dimulai oleh transaksi lain, ia bukan merupakan nested transaction (transaksi bersarang) untuk alasan-alasan sebagai berikut:

  • Ia tidak membagi sumber-sumber daya transaksional (seperti locks (penguncian)) dengan main transaction
  • Ia tidak bergantung pada main transaction. Sebagai contoh, jika main transaction melakukan roll back, nested transactions melakukan roll back, namun autonomous transactions tidak.
  • Perubahan-perubahan yang di-commit terlihat segera oleh transaksi-transaksi lain. (pada nested transaction hal ini tidak terlihat segera oleh transaksi-transaksi lain sampai main transaction di-commit.)
  • Exceptions yang muncul dalam autonomous transaction menyebabkan rollback pada level transaksi, tidak pada level perintah.

6.9.2.2. Transaction Context

Gambar 6-2 menunjukkan, main transaction membagi context-nya dengan nested routines, namun tidak dengan autonomous transactions. Sebaliknya, ketika satu autonomous routine memanggil yang lain (atau dirinya sendiri secara recursif), routines tidak berbagi transaction context. Namun, ketika sebuah autonomous routine memanggil non-autonomous routine, routines berbagi transaction context yang sama.

Gambar 6-2 Transaction Context

6.9.2.3. Transaction Visibility

Seperti ditunjukkan oleh Gambar 6-3, perubahan yang dibuat oleh sebuah autonomous transaction menjadi terlihat oleh transaksi-transaksi lain ketika autonomous transaction melakukan commit. Perubahan-perubahan juga menjadi terlihat oleh main transaction ketika ia dimulai kembali, namun jika level isolasinya diset menjadi READ COMMITED (nilai default).

Jika kita mengeset level isolasi dari main transaction menjadi SERIALIZABLE, seperti berikut ini, perubahan-perubahan yang dibuat oleh autonomous transactions-nya tidak terlihat oleh main transaction ketika ita dimulai kembali:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Gambar 6-3 Transaction Visibility

 

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19


Bookmark and Share

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb.

 

Find Related articles