COMMIT FORCE etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
COMMIT FORCE etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

23 Ağustos 2010 Pazartesi

2PC Transaction

Selamlar,

Birkaç yazı öncesinde şüphede kalan adı altında çevirdiğim "in-doubt" transaction'lar ile ilgili biraz daha detaylı bilgi vermek istiyorum.

Neden şüpheli olacağını sorabilirsiniz. Bu tarz transaction'lar genelde bir db link ile başka bir veritabanına bağlanırlar ve o veritabanında güncelleme yaparak, commit işlemi de gerçekleştirebilirler. Bu kimi zaman o kadar yoğun olur ki, arada sırada hatalara ve beklemelere bile yol açabilir.

Aşağıdaki bu tarz transaction'lar ile ilgili bir örnek vermek istiyorum. Bu örnek bir veritabanının alert.log dosyasından alınmıştır;

Mon Aug 23 16:28:46 2010
Error 2068 trapped in 2PC on transaction 69.95.1106249. Cleaning up.
Error stack returned to user:
ORA-02068: following severe error from TABLE_NAME
ORA-03135: connection lost contact

"on transaction" sonrasında verdiği değer, ilgili transaction'ın tanımlanmasında kullanılabilir. Başlangıçtaki 2068 ise bir çeşit ORA hatasıdır. ORA hatasının ve ona eşlik eden hata ya da hataların tanımlarını da bir sonraki satırlarda görmektesiniz.

Benim genelde gördüğüm hata kodu 2068 ancak açıkçası 2068 dışında da bir hataya rastlamadım :) 3113 hatası alan görmüştüm ama bu hatayı ben almadım. 3113 aslında biraz daha tehlikeli bir hata zira "end-of file on communication channel" yani bağlantı kanalında sonlanma hatası genel bir hatadır ve teşhis etmesi de zor olabilir.

Peki bu hata neden oluşmakta? En büyük sebeplerinden birisi, db link ile bir transaction açılmış iken bu transaction'ın kötü bir şekilde sonlandırılması ya da rollback yapmaya zorlanması.

In-doubt transaction eğer hata geçerli ise kontrolünü yapabileceğiniz bir data dictionary görüntüsü mevcuttur;

dba_2pc_pending

Bu görüntüde transaction ile ilgili bilgileri görebilirsiniz. Eğer "pending" yani bir şekilde bekleyen ve takılmış bir transaction bulunuyorsa, daha önce yazdığım COMMIT FORCE başlığı altında neler yapılması gerektiğini görebilirsiniz. Aynı şekilde dilerseniz ROLLBACK FORCE komutunu da kullabilirsiniz.

Bir de hemen dip not eklemem gerekiyor ki, bir transaction'a isim verebilirsiniz ve bu şekilde uzun süren ve bir db link kullanmak zorunda olan transaction'ların takibini de kolaylayabilirsiniz.

Son olarak bu yazıda ekleyebileceğim bir bilgi ise unutmayınız ki "database link" ismini verdiğimiz hızlı geçiş bağlantıları, sonradan açılan bir sqlplus ekranından farksızdır. Database link'i yarattığınız kullanıcı ile bağlanır, onun hakları ile sorgulama yapar ve veri girişi sağlarsınız. SYS ile kendi veritabanınızda bağlı olmanızın hiçbir anlam ifade etmediğini, size tanımlanmış olan database link kullanıcısının haklarına sahip olarak sorgulama yaptığınızı unutmayınız.

İyi çalışmalar.

Ogan


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
Takip et: @oganozdogan