13 Ağustos 2010 Cuma

COMMIT & Transaction

Selamlar,

Her Oracle veritabanında gönderebileceğiniz bir komut tipi olan "COMMIT" (işlemek), bir transaction'ın sonlandığını Oracle'a bildiren ve yaptığınız değişikliklerin kalıcı olacağını talep eden komuttur.

Transaction: Bir transaction; birden çok SQL sorgularının çalıştırıldığı ama Oracle'ın, bu sorguların tamamını bir ünite(set) olarak algıladığı mantıksal sorgu bloğudur. Bu blok rollback ya da commit ile parçalanabilir veya sonlandırılabilir.

Bir transaction'ı commit etmediğiniz zaman;

1) Kendi transaction'ınınızda yaptığınız bütün sorgusal değişiklikleri sadece kendiniz görebilirsiniz. Bu değişiklikler diğer kişiler için geçerli değildir. Commit; komutunu gönderdiğiniz zaman, transaction içerisinde yaptığınız tüm değişiklikler diğer kullanıcılar tarafından da görüntülenebilir hale getirilecektir.
2) Bu transaction içerisinde yaptığınız tüm değişiklikleri geri alabilirsiniz (Bkz. Rollback, Bkz. Undo).

Oracle DML (Data Manupilation Langugage) komutlarından sonra commit koşmaz ancak DDL (Data Definition Language) komutlarından önce ya da sonra saklı bir commit komutu gönderir.

Commit komutunu ayrıca;

1) Şüphede kalan bir transaction'ı elle sonlandırmak (Bkz. in-doubt transaction),
2) SET TRANSACTION komutu ile sadece okumak için oluşturulmuş bir transaction'ı sonlandırmak

için kullanabilirsiniz.

Oracle'ın tavsiyesi, her transaction'ın bir şekilde sonlandırılması yönündedir. Bu, commit ya da rollback ile gerçekleştirilebilir. Eğer Commit ya da Rollback göndermeden bağlantınız kötü bir şekilde sonlanmışsa, o anki transaction'da yaptığınız bütün değişiklikler otomatik olarak rollback yapılacaktır (Bkz. SMON (System Monitor Background Process)).

Oracle araçlarından yapacağınız normal bir çıkışla birlikte geçerli olan transaction commit edilmiş sayılmaktadır. Ayrıca commit komutunu koşabilmek için de hiçbir yetkiye sahip olmanıza gerek yoktur.

Şüphede kalmış bir transaction'ı sonlandırmak, yani commit etmeye zorlayabilmek için FORCE TRANSACTION sistem yetkisine ihtiyacınız varken, orjinal kullanıcısı tarafından commit gönderilmiş ve şüphede kalan transaction'ı sonlandırmak içinse FORCE ANY TRANSACTION sistem yetkisine ihtiyacınız vardır.

Commit sentaksı aşağıdaki gibidir;

commit::=

Description of commit.gif follows

WORK

COMMIT ve COMMIT WORK komutları aynı görevi yapmaktadır.

Bu arada Şüphede kalan yani in-doubt transaction için DBA_2PC_PENDING data dictionary görüntüsünü inceleyebilirsiniz.

COMMENT

Comment, yani yorumu bir transaction için kaydedebilirsiniz. Comment alanını kullanabileceğiniz en güzel nokta ise DBA_2PC_PENDING data dictionary görüntüsünde "text" alanında tutulan ve 255 byte içerebilen yorumu görme imkanı sağlar. Bu sayede in-doubt transaction'ları takip ederken, neyi COMMIT FORCE yapmanız gerektiğiniz görebilirsiniz.

WRITE

Redo log'a yazılacak ve commit operasyonu tarafından yaratılmış redo bilgilerinin sıralamasının belirlenmesinde kullanılan bir ifadedir. Bu ifade, oluşan I/O beklemelerini azaltarak, gecikmeleri azaltabilir. Aşağıdaki durumlarda performansı arttırabilir ve kullanabilirsiniz;

1) Gerçekleşen "update" transaction'ı eğer çok büyük ise ve redo log'ların disk'e yazılması çok sık ise.
2) Uygulamanın asenkron commit edilmiş transaction'ları tolere edebileceği durumlarda.
3) Redo log tarafından oluşturulan yazma bekleme sürelerini azaltmada.

WRITE IMMEDIATE

Immediate yazma seçeneğini seçmişseniz eğer LGWR'a gönderilen otomatik bir mesaj sayesinde I/O arttırılabilir ve commit edilen transaction'ın hemen yazılmasını sağlayabilirsiniz.

WRITE BATCH

Batch komutuyla redo, redolog'a yazılması için saklanır. Hiçbir I/O işlenmez.

WRITE WAIT

Wait komutuyla gönderdiğiniz COMMIT'in oluşturuğu redo, online redolog'lara yazılana kadar işlenmez. Bir anlamda gönderdiğiniz COMMIT tutarlı bir redo üretip, online redo log'lara yazılıncaya kadar gönderilmiş sayılmaz.

WRITE NOWAIT

WAIT komutunun tam tersidir ve COMMIT işleme, beklemeden alınır.

FORCE

Şüphede kalan bir transaction'ı elle commit'e zorlamaya yarar. Bu tarzda transaction'ları bulabilmek için DBA_2PC_PENDING data dictionary görüntüsü sorgulanır ve ilgili transaction commit'e zorlanır. COMMIT'e zorlanan transaction ile bulunduğunuz transaction arasında bir bağlantı yoktur ve kendi transaction'ınınız COMMIT edilmiş sayılmaz.

İyi çalışmalar.

Ogan

Hiç yorum yok:

Takip et: @oganozdogan