Oracle’da Autonomous Transactions (Özerk DB İşlemleri) Yapısı ve Kullanımı

Herkese Selam,

Bu yazımda sizlere Autonomous Transaction yapısı, etkileri ve kullanımı hakkında bilgiler vereceğim.

Öncelikle Transaction’ın genel anlamda ne olduğunu kısaca açıklamak gerekir.

Transactions: Transaction’lar bir veritabanını, İşletim Sisteminin sahip olduğu bir dosya sisteminden ayırt eden en temel özelliktir. Basit bir şekilde tarif edicek olursak, begin yada herhangi bir SQL cümlesi ile başladığımız ve COMMIT, ROLLBACK veya işlemleri sonlandıracak bir söz deyimi ile karşılaşmamız arasında yapılan tüm aksiyonlardır. Transaction’lar en temel olarak verilerin bütünlüğünü ve tutarlılığını sağlamak için oldukça önemlidir.   Doğru kullanılması ve yönetilmesi oldukça kritiktir.( ‘ Transactions are a fundamental feature of all databases – they are part of what distinguishes a database from a file system. And yet, they are often misunderstood and many developers do not even know that they are accidentally not using them.‘  Tom KYTE ). Transaction kavramı ve yapısı üzerine daha detaylı bir çalışma yapmak gerekmektedir. Transaction kavramı ve yönetimi Database dünyası için en önemli konuların başında gelmektedir. Bu konu ile ilgili Tom KYTE’ın “Expert Oracle Database Architecture, Second Edition” kitabının Transactions (Chapter 8) bölümü ayrıntılı bir şekilde incelenebilir. Bunun yanı sıra konu hakkında detaylı bilgiler http://docs.oracle.com/cd/E11882_01/server.112/e25789/transact.htm#i6564 linkinden incelenebilir.

Oracle Gurusu, Hasan Tonguç YILMAZ’ın Transaction ve Yönetimi ile ilgili yaptığı sunumda (video+sunum dökümanı) bu konu kapsamında incelenebilir. Autonomus Transaction kavramının daha rahat anlaşılabilmesi için bu videonun izlenmesinin faydalı olacağını düşünmekteyim. Linkleri aşağıdaki gibidir.

Video Part1: http://www.seyretogren.com/video/oracle-transaction-management-1.html

Video Part2: http://www.seyretogren.com/video/oracle-transaction-management-2.html

Video Part3: http://www.seyretogren.com/video/oracle-transaction-management-3.html

Video’da anlatılan sunum linki: http://tonguc.files.wordpress.com/2010/12/oracle-veritabanc4b1nda-transaction-yc3b6netimi-giric59f-hty.ppt

Transaction kavramı ile ilgili kısa bir bilgi verdikten sonra şimdi Autonomous Transaction kavramına giriş yapabiliriz. Bu yapıyı anlatırken daha çok örnekler üzerinden gitmenin daha anlaşılır olcağını düşündüğümden biraz teorik bilgi verdikten sonra örnekler üzerinden devam edeceğim.

Autonomous Transaction: Autonomous Transactions  isminden’de anlaşılacağı gibi ana yürüttüğümüz transactiondan özerk çalışan ve ana transactionımızın başlattığı başka bir transaction’dır. Buradaki özerklik, otonom çalışan transaction’ın yapacağı commit veya rollback’in ana transaction’ı etkilemiyeceğidir. Bunun tam tersi durumdada aynı şey geçerlidir. Ana transaction’ın karşılacağı hata, ROLLBACK, COMMIT gibi transaction’ı sonlandıracak işlemler otonom transaction’ımızı etkilememektedir. Şimdi bu bahs ettiğimiz konuyu örnekler ile açıklayalım.

İlk etapta farkı anlayabilme adına Autonomous Transaction yapısını kullanmadan bir örnek deneyip klasik transaction mantığımızın nasıl çalıştığını inceleyelim.

Öncelikle kayıt yazacağımız bir tablo yaratalım.

CREATE TABLE AUTOTABLE
(
COLA NUMBER
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

Daha Sonra ana kod bloğumuzdan çağıracağımız ve oluşturduğumuz tabloya kayıt yazan ve bu yazdığı kayıdı rollback eden bir procedure yazaılım.

CREATE OR REPLACE PROCEDURE HR.autotry
IS

BEGIN
INSERT INTO autotable
VALUES (155);

ROLLBACK;
END;

Şimdi yazdığımız klasik transaction mantığımızın nasıl çalıştığını anlamak için bir PL/SQL kod bloğu yazalım ve sonuçları inceleyelim.

BEGIN
INSERT INTO autotable
VALUES (233434); — Tabloya 1 Satir kayit atildi.

autotry; –Procedure Cagirldi

INSERT INTO autotable
VALUES (514355); — Tabloya 1 Satir kayit atildi.

COMMIT; –Transaction Commit ile sonlandirildi.
END;

Evet şimdi Tablomuzda oluşan kayıtları inceleyelim.

select * from autotable;

Evet sonuc’a baktığımızda ana transaction’ımızda 2 satır insert etmemize rağmen procedure çağırıldıktan sonra procedure içinde ROLLBACK yazıldığından dolayı yalnızca bir satır insert edildiğini görüyoruz. Bu insert edilen kayıtda procedure’den dönüldükten sonra yapılan insert işlemi. Procedure içinde yaptığımız ROLLBACK, ana kodumuzda procedure’u çağırmadan yaptığımız insert işlemininde silinmesine neden oldu. Yani  lojik sıraya göre ROLLBACK’ten önce yapılan insertler silindi, ROLLBACK’ten sonra yapılan insertler yaşamını sürdürmeye devam etti.  Yukarıda yaptığımız örneğin tam tersi durumuda düşünebiliriz. Ana kodumuzda yaptığımız ROLLBACK procudurede yaptığımız kayıtları silecekti. Yani örnektende anlıyacağımız gibi biz ne kadar prosedürel yapı kurup belkide transaction’ın bölüneceğini düşünsekte, transaction’ın parçalanmaz bir bütün olduğunu görmekteyiz. Aslında bu durumdan data bütünlüğünün ve tutarlılığının sağlanması için tasarlanmış olduğunu çıkarabiliriz. Ancak bazen yaptığımız iş gereği bu yapının bu şekilde çalışmasını istemeyebiliriz. Yazdığımız kod içinde birbirinden bağımsız çalışan transactionların varlığına ihtiyaç duyabiliriz. İşte bu ihtiyacın duyulduğu yerde Autonomous Transaction yapısından faydalanıyoruz.

Şimdi Yukarıdaki Örneğin Aynısını Transactionları birbirinden bağımsız hale getirerek gerçekleştirip sonucu birde öyle inceleyelim fakat öncelikle bu yapının nasıl kullanacağını söylemek daha doğru olacaktır. Bu yapıyı PRAGMA AUTONOMOUS_TRANSACTION söz deyimi ile gerçekleştiriyoruz. Bu söz deyimini ister PL/SQL bloğumuzda declare’da ister fonksiyon, procedure tanımlarımızın hemen ardından yazıp ilgili blokların otonom bir işlem olduğunu bildirebiliriz. Şimdi aşağıdaki örneğimizi inceleyelim.

CREATE OR REPLACE PROCEDURE autotry
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO autotable
VALUES (155);

ROLLBACK; — Otonom blok mutlaka commit veya rollback ile sonlandırılmalı.
END;

— Ana Kod Bloğumuz

BEGIN
INSERT INTO autotable
VALUES (233434);

autotry;

INSERT INTO autotable
VALUES (514355);

COMMIT;
END;

Ana kod bloğumuzu çalıştırdıktan sonra şimdi sonucumuza bakalım.

select * from autotable;

Evet sonuctanda anlaşılacağı gibi bu sefer prosedür içinde yapılan rollback işlemi ana kodumuzda yaptığımız insert işlemini silmedi, yani böylelikle transactionları birbirlerinden bağımsızlaştırmış olduk. Transactionları bağımsızlaştırmak bize modüler yapılar kurmamıza olanak sağlayan müthiş bir sistem aslında. Transaction anlamında yapacağımız işleri bölmek bize tekrar tekrar kullanabileceğimiz kod blokları yazmamızada olanak sağlayacaktır.

Önemli Not: Autonomous olarak belirttiğimiz kod blokları mutlaka bir commit veya rollback komutu ile sonlandırılmalıdır. Aksi takdirde compile-time da hatalar alınacaktır.

Şimdi Autonomus Transactionların Teorik Özelliklerinden Bahsedeceğim

a) Autonomous Transactions ana  transactiondan bağımsızdır.

b) Ana transaction Autonomous Transaction’dan dönülene kadar suspend edilir.

c) Autonomous Transactions nested bir yapıya işaret etmez. Nested bir transaction değildir.

d) Ana transaction’da yapılacak ROLLBACK, Autonomous Transaction’ları etkilememektedir.

e) Autonomus Transactionların sınırları begin-end blokları arasında belirlenmiştir.

f) Autonomous Transaction üzerinden yapılmış commit işlemi, bu bölgede yapılmış değişikliklerin geçerli olması için yetecektir.

g) İç içe yazılmış begin end bloklarını autonomous olarak belirleyemeyiz.

Örnek:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO autotable
VALUES (514355);

COMMIT;
END;

INSERT INTO autotable
VALUES (355);

ROLLBACK;
END;

h) Yazılacak otonom bloklarda sayı limiti yoktur. Dilenen sayıda otonom kod bloğu yazılıp ana transaction tarafından çağırılabilinir.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root, Uncategorized and tagged , , , , , , , , , , . Bookmark the permalink.

One Response to Oracle’da Autonomous Transactions (Özerk DB İşlemleri) Yapısı ve Kullanımı

  1. Pingback: Oracle’da Autonomous Transactions (Özerk DB İşlemleri) Yapısı ve Kullanımı | Melih Keskin

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