Oracle Transactions – 3

Herkese Selam,

Bu yazıda, daha öncede yazmaya başladığım Oracle Transactions yazı dizisine kaldığım yerden devam edeceğim.

Bu konu hakkında daha önce yazdığımız 2 yazıda Transactionlara giriş yapıp atomicty kavramından ve implementasyonundan bahsetmiştik bu yazıdada Transactionların diğer bir önemli özelliği laran Durability’den bahsedeceğim. Bu konu ile ilgili yazdığım diğer yazılara aşağıdaki linklerden erişebilirsiniz.

https://emrahmete.wordpress.com/2012/05/26/oracle-transactions-1/

https://emrahmete.wordpress.com/2012/06/09/oracle-transactions-2/

Durability

Oracle’da transactionların 4 temel özelliği taşıdığını daha önceden de anlatmıştık. Bu özellikleri başlık olarak hatırlıyacak olursak; Atomicity-Consistency-Isolation-Durability. Şimdi bu özelliklerden Durability yapısını açıklamaya başlayalım.

Durability, transaction’ımız commit’lendikten sonra yapılan tüm değişikliklerin kalıcı hale gelmesini garanti eden transaction özelliği. Öyleki, commit basıldıktan hemen sonra database xrash alsa bile bu bilgilerin kalıcı olduğu garanti altına alınır ve database’e yansıtılır. Ancak 2 spesifik durumda bu özellik garanti edilmez.

Bu durumları şu şekilde ifade edicek olursak

– 10g Release2 ile beraber gelen ve COMMIT ile beraber kullanılan WRITE opsyonunu kullanmak. (Asyncronous Commit) — COMMIT WRITE ….

-Yazdığımız dağıtık olmayan  (Aynı db, no db links)PL/SQL bloklarında döngü içerisinde commit kullanmak.

COMMIT WRITE ….

Commit Write opsyonu Oracle 10g R2 ile beraber dünyamıza giren özelliklerden biridir.  Commit Write özelliğinin transactionlara sağladığı opsyonlardan bahs etmeden önce klasik commit davranışının ne olduğundan birazcık bahs etmek istiyorum.

Bir transaction başlattığımızda yazdığımız her DML sonucunda, Oracle arka planda , database üzerinde daha sonradan oluşabilecek bir sıkıntı anında database’de yapılan değişiklikleri yeniden tekrarlayabilmek ve data kaybına sebebiyet vermemek için bir log tutar. Bu loglara Oracle terminolojisinde REDO log adı verilmekte. İlgili transactionımız her DML cümlesinde REDO üretmeye devam eder ve bu üretilen REDO’lar REDO log Buffer’da (Redolog buffer memory’de) tutulmaya başlanır. Ne zamanki explicit veya implicit bir commit çalışıtırılır, ilgili transaction ile ilgili memory de olan tüm redo kayitları Online Redolog adı verdiğimiz disklere LGWR işletim sistemi prosesi tarafından yazılır. Memory’de tutulan bu redolog’larin disklere taşınması bir I/O gerketirdiğinden transactionlarımızın sonlanmasıda belli bir miktar yavaşlar(Oracle Optimist bir yaklaşımla transaction sanki commit ile sonlanacakmış gibi işlem yaptığından redo kayitlari aslında commit basılmadan asenkron olarak disklere taşınmaya başlanır bu sebeple commit’in I/O maliyetini %100 yaşamayız). Redolog’lar disklere yazılmadan o transaction sonlanmıi sayılmaz ve PL/SQL bloğu redolog yazılma işlemi bitmeden kaldığı yerden devam edemez. İşte bu davranışın transactionlara sağladığı en önemli özellik DURABILITY. Yani redolog lar güvenli bir şekilde disklere taşındıktan sonra db herhangi bir crash alsa bile yapılan değişikliklere geri döndürülebileceğinden dolayı  yapılan tüm değişiklikler kalıcı olmuş oluyor.

Klasik COMMIT alt yapısını anladıktan sonra şimdi DURABILITY özelliğini kıran exceptional durum olan COMMIT WRITE ın davranışını inceleyelim.

COMMIT WRITE, COMMIT esnasında redo logların diske yazılması için yapılan I/O kaynaklı performans kaybını azaltmak üzerine farklı bir kaç commit opsyonunun sunulduğu bir yapıdır. Bu yapı ile sunulan opsyonlar ile commit cümlemizin davranışını belirleyebilmekteyiz. Şimdi COMMIT WRITE ile kullanılabilecek opsyonları ve davranışlarını inceleyelim.

“COMMIT WRITE IMMEDIATE”: Redo logların hiç beklemeden diske yazılması emri verilir. Her commit’de bu şartdan dolayı I/O yapılması zorunlu kılınır.

“COMMIT WRITE WAIT”: Commit ile eş zamanlı olarak redo logların disklere(Online redo log) yazılması sağlanır. Redolog lar disklere yazılmadan sistem transaction işlemeye devam etmez.

“COMMIT WRITE NOWAIT”: Commit’in asenkron yapıldığını anlatan cümledir. Bu cümle ile commit yapılırsa sistem redologların disklere yazılmasını beklemeden yaptığı işlemlere devam edebilir.

“COMMIT WRITE BATCH”: Bu commit seçneği ile redolog lar o an diske yazılmazlar yani commit yapıldığı an için herhangi bir I/O işlemi ilgili transaction için yapılmaz.

Bu opsyonlardan DURABILITY özelliğini kıran komutlar NOWAIT ve BATCH seçenekleridir. COMMIT bu komutlar ile sonlandırılır ise ve database kontrolsüz bir şeklide kapanır ise redologlar disklere eş zamanlı yazılmadığından dolayı veri kaybı yaşanarak o anki yapılan değişikliklerin kalıcılığı sağlanamayacaktır. Bu sebepten dolayı batch şekilde yapacağımız yada nowait ile yapacağımız commit işlemlerini 2 kez düşünmeliyiz. Veriyi geri getirme anlamında bize büyük sorunlar yaşatabilecek seçeneklerdir.

Dağıtık Olmayan PL/SQL bloklarında COMMIT Kullanımı

Durability özelliğini kıran 2. özelliğin, yazdığımız PL/SQL bloklarında COMMIT işlemini gerçekleştirme şeklimizin transparan bir Asenkron COMMIT’e neden olacağıdır. Aslında bu durum Oracle’ın PL/SQL çalıştırma performansını utilize etme durumu ile doğrudan ilgilidir. Bu durumla ilgili aşağıdaki örnek incelenebilir.

CREATE TABLE table1 AS SELECT * FROM v$transaction where rownum<1;

CREATE PROCEDURE example
AS
trow v$transaction%ROWTYPE;

CURSOR x
IS
SELECT *
FROM v$transaction;
BEGIN
OPEN x;

LOOP
FETCH x
INTO trow;

EXIT WHEN x%NOTFOUND;

INSERT INTO table1
VALUES trow;

COMMIT; — Burada yapilan commit aslinda asenkron calisiyor. Yani commit write nowait gibi;

END LOOP;

— Ne zaman prosedür bitiyor, ozaman redolar LGWR tarafindan disklere yaziliyor.

END;

Eğer prosedür bitmeden database anormal bir durumla karşı karşıya kalıp kapanır ise buradaki loglar diske yazılmadığı için datayı geri döndürmek mümkün olmayacaktır.

Kaynaklar:

“Expert Oracle Database Architecture 2011″, Tom KYTE

http://www.orafaq.com/node/93

tonguc.wordpress.com

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm

Advertisements

About ... from Emrah METE

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

2 Responses to Oracle Transactions – 3

  1. Pingback: CREATE SCHEMA SÖZ DEYİMİ İLE TRANSACTIONAL DDL | Emrah METE

  2. Pingback: TRANSACTIONAL DDL BASIS WITH CREATE SCHEMA PHRASE | Emrah METE

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