Autonomous Transaction

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

Autonomous transactionlar başka bir transaction tarafindan başlatılan ve kendisini çağıran(başlatan) transactiondan (main transaction) tamamen bağımsız çalışan transactionlardır. Örneğin bir transaction içerisinde işlemin sonucuna bakılmaksızın log oluşturmak istiyor olalım, log tablomuz işlem başarılıysa zaman,kullanıcı gibi bilgileri, başarısız olursa zaman ve kullanıcı ile beraber alınan hata bilgisini tutuyor olsun. Transaction içerisinde işlem başarılıysa commit edeceğimiz için sorun yok log tablomuza da insert yapıp commit ile kaydederiz. Peki transaction içersinde hata aldık ve rollback yapmak istersek ne olacak? İşte burada ana transactionumuzdan bağımsız çalışan ve log tablomuza her şartta kayıt yazan bir alt programa ihtiyacımız olacak ve bu transaction ana transaction sonucu ne olursa olsun log tablomuza yazdığı kaydı commit edecek.

Şimdi biraz autonomous transactionların özelliklerine bakalım sonrada syntax'ını görelim.

  • AT lar top-level anonymous block için kullanılabilir. Yani nested-block'ları autonomous olarak tanımlayamazsınız.
  • Standalone veya packaged procedure ve functionları AT olarak tanımlayabilirsiniz.
  • Database triggerleri AT olarak tanımlanabilir.

Bütün bir packageyi AT olarak tanımlayamazsınız ama package içerisindeki bütün function ve procedureleri ayrı ayrı AT olarak tanımlayabilirsiniz.

AT triggerlar ile normal triggerler arasındaki fark ise AT içerisinde COMMIT, ROLLBACK yapılabiliyor olması ayrıca EXECUTE IMMEDIATE ile yazıldığında CREATE DROP gibi DDL statementleri de AT triggerler içerisinde kullanılabilir.

AT kullanılırken çok dikkat etmek gerektiğini düşündüğüm bir nokta; MT içerisinde SAVEPOINT kullanıyorsanız ve SAVEPOINT noktanız AT yi başlattığınız noktadan önceyse ve siz AT bittikten sonra MT içerisinde SAVEPOINT noktasına dönmek isterseiz AT içerisinde yapılan işlem rollback edilmez. Bunun sebebi AT nin tamamen MT den bağımsız çalışan bir transaction olmasıdır. Bağımsız çalışan bir transaction olduğu için de main transaction ile lock, commit-dependency vs. paylaşmaz.

Bu bağımsız çalışma ilkesinin birtakım sakıncaları var,AT yi bunlara dikkat ederek kullanmak gerekir. Eğer AT içerisinde MT tarafından lock edilmiş bir kayıt ile işlem yapmak isterseniz deadlock oluşur ve AT içerisinde hata alırsınız. Bu hatayı handle etmemişseniz AT rollback edilecektir. Aynı şekilde AT yi commit veya rollback etmeden çıkmak isterseniz veya handle edilmemiş herhangi bir hata ile karşılaşılırsa AT otomatik olarak rollback edilir.

AT içerisinde yaptığınız bir commit diğer transactionlar tarafından görünmeye başlar. Eğer main transaction'un isolation level'ini READ COMMITTED yapmışsanız(default olarak böyledir) MT (main transaction) içerisinde de bu değişiklikleri görebilirsiniz ancak isolation level'i SERIALIZABLE olan MT AT nin sonucunu göremez.

Syntax ise oldukça basit.

Kullanacağımız program unit'in declare section'unda

PRAGMA AUTONOMOUS_TRANSACTION;

tanımını yapmamız yeterli. Bu ifadeyi declare sectionunda istediğimiz yere yazabiliriz ancak
okunurluğu artırmak ve unit'imizin AT olduğunun daha kolay anlaşılabilmesi için Declare sectionun ilk
satırında yazmamız önerilmektedir.
Daha öncede yazdığım gibi AT yi sonlandırmak için commit veya rollback yapmamız gerek yoksa hata alırız.

Basit bir örnekle kullanımını görelim.

 

CREATE TABLE AT_TEST (id         number, explanation varchar2 (15))

 

CREATE PROCEDURE AT_INSERT
IS
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   INSERT INTO at_test (id, explanation)
     VALUES   (3, 'Auto Trans');

   INSERT INTO at_test (id, explanation)
     VALUES   (4, 'Auto Trans');

   COMMIT;
END;
/

 

BEGIN
   INSERT INTO at_test (id, explanation)
     VALUES   (1, 'Main Trans');

   INSERT INTO at_test (id, explanation)
     VALUES   (2, 'Main Trans');

   AT_INSERT;
   ROLLBACK;

END;
/

 

Kısaca bir test tablosu yarattık. AT_INSERT proceduresi tanımındanda anlayacağınız gibi bir Autonomous transaction. Deneme yaparken ise AT_TEST tablosuna iki kayıt insert edip bu kayıtları select ediyoruz. Daha sonra AT proceduremizi çağırıp 3,4 id li kayıtlarımızı tabloya insert edip commit ediyoruz. Daha sonra MT içerisinde ROLLBACK yapalım bakalım ne olacak sonucu görelim.

Main transaction içerisinde yaptığımız insertler yaptığımız rollback ile geri alındı ancak AT içerisinde yaptığımız işlem geri alınmadı. Bu bağımsız çalıştıklarını tekrar kanıtlamış olduk. Faydalı olur inşallah.

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page