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


Hiç yorum yok:

Takip et: @oganozdogan