Bir başka transaction içersinden cağrılabilen bağımsız transaction’lardır.”Autonomous Transaction” ana transaction’dan cağrıldığı noktada çalışmaya başlar, bir takım sorgular ve/veya işlemler(insert, update, delete vs…) yapar ,sonra yapılanları commit ya da rollback eder, işi bittikten sonra ana transaction kaldığı yerden devam eder, “Autonomous Transaction” içersinde yapılan commit ya da rollback ana transaction dan bağımsızdır, onu etkilemez.Ana transaction için ayrı bir commit ya da rollback yapılmalıdır.
Set edilen transaction seviyesinin durumuna göre “Autonomous Transaction” ‘da yapılan değişiklik kendisi “commit” ettiği anda ana transaction tarafından görülür.Yine ana transaction’da yapılan değişiklik commit edilmeden “Autonomous Transaction” tarafından görülmez.Ana transaction ile (mesela lock konusunda) kaynak paylaşımı yapmaz, SELECT dısında bir DML işlemi yapıldıgında muhakkak COMMIT ya da ROLLBACK yapılmalıdır, aksi halde hata verir.
Ana transciton ile aralarında “deadlock” oluşma durumu vardır.Bu sebeble tasarım yaparken buna dikkat edilmeidir.İç içe birden fazla “Autonomous Transaction” yapılabilir.Özellikle ana transaction’dan bağımsız işlemlerde kullanılır.Mesela log işlemi yapmak ya da bir işlemi deneme sayısı tutmak gibi…
“Autonomous Transaction” özelliğinde faydalanmak için derleyiciye bunu bildirmemiz gerekir.Bunu da “AUTONOMOUS_TRANSACTION” anahtar kelimesini bloğumuzun başına koyarak sağlarız.Bu “anonymous block” blok olabileceği gibi, fonksiyon ya da prosedürde olabilir.
Aşağıda bir transaction esnasında alınan hataları kaydeden(log) bir örnek bulabilirsiniz.Önce hataları tutacağımız bir tablo oluşturalım:
CREATE TABLE terrorlogs (
id NUMBER(10) NOT NULL,
log_date DATE NOT NULL,
error_message VARCHAR2(4000),
CONSTRAINT error_logs_pk PRIMARY KEY (id)
);
Sonra alınan her hatayı bir “ID” ile ilişkilendirmek için sequence oluşturalım
CREATE SEQUENCE error_logs_seq;
Hata alındıgı anda bunu hata tablomuza yazacak olan Autonomous Transaction özellikli prosedürümüzü oluşturalım :
CREATE OR REPLACE PROCEDURE prc_log_errors (p_error_message IN VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO error_logs VALUES (error_logs_seq.NEXTVAL,
sysdate, p_error_message);
COMMIT;
END;
/
Elimizde gerekli kodlar artık var.Şimdi de bu örneği gerçekleyelim :
BEGIN
INSERT INTO at_test (id, description)
VALUES (998, ‘Description for 998′);
— NULL alamayacak alana NULL insert etmeye calışalım.
INSERT INTO at_test (id, description) VALUES (999, NULL);
EXCEPTION
WHEN OTHERS THEN
log_errors (SQLERRM);
ROLLBACK;
END;
Kodu çalıştırdıgımızda oluşan hatadan sonra ROLLBACK kullanılmasına rağmen TERRORLOG tablosunda hataya ait commit edilmiş bir kayıt görülecektir.
Kaynak: www.gelecekonline.com