Makale Özeti

COM + üzerine proxy ve güvenlik üzerine yazılar yazdıktan sonra bu yazıda transaction nedir ve nasıl yapılır , avantajları nelerdir bunları inceleyeceğiz. Konunun iyi anlaşılması için iki dll oluşturuldu. Bu dll’ler ikinci ve ilk olarak isimlendirildi. İkinci dll ilk dll’i çağıracak şekilde programlandı.

Makale

COM+ da Transaction Özelliği

 

COM + üzerine proxy ve güvenlik üzerine yazılar yazdıktan sonra bu yazıda transaction nedir ve nasıl yapılır , avantajları nelerdir bunları inceleyeceğiz. Konunun iyi anlaşılması için iki dll oluşturuldu. Bu dll’ler ikinci ve ilk olarak isimlendirildi. İkinci dll ilk dll’i çağıracak şekilde programlandı.

 

İkinci Dll;

 

VeriEkleB

VeriEkleMix metodlarını içermektedir.

 

İlk Dll ise;

 

VeriEkleA metodunu içermektedir.

 

Önemli rolü üstlenen VeriEkleMix, VeriEkleA’yı daha sonrada VeriEkleB’yi çalıştırmaktadır. Biz de bu noktada transaction uygulaması yapacağız. Yani metotlardan birinde sorun çıktığında yapılmış olan tüm işlemler geri alınacaktır.

 

 

 

VeriEkleB ; deneme isimli tablomuza “ikinci” yazarken , VeriekleA ; deneme isimli tablomuza “ilk” yazacak. Bunun yanında VeriEkleMix; önce VeriEkleB ‘yi daha sonra VeriEkleA’yı çalıştıracaktır.

 

Dosyaların içeriğini görmek bu aşamada faydalı olacaktır.

 

İkinci.dll

 

Public Sub veriekleB() Implements kurallar.veriekleB

        Try

            Dim b As String = "insert into deneme (ad,soyad) values (ikinci,ikinci)"

            Dim cmd As New SqlCommand(b, conn)

            conn.Open()

            cmd.ExecuteNonQuery()

            conn.Close()

            MsgBox("hatasız tamamlandı")

            ContextUtil.SetComplete()

        Catch ex As Exception

            MsgBox(ex.ToString)

        End Try

 

    End Sub

 

 

 

    Public Sub veriekleMix() Implements kurallar.verimix

        Dim k As Integer

        Try

            veriekleB()

            

            Throw New Exception("hata olustu")

           

            Dim f As New ilk.ilkuyg

            f.veriekleA()

            End If

            MsgBox("tümü hatasız tamamlandı")

        Catch ex As Exception

 

            MsgBox(ex.ToString)

 

        End Try

 

İlk.dll

 

Public Sub veriekleA() Implements kurallar.veriekleA

        Try

 

            Dim b As String = "insert into deneme (ad,soyad) values (ilk,ilk)"

            Dim cmd As New SqlCommand(b, conn)

            conn.Open()

            cmd.ExecuteNonQuery()

            MsgBox("hatasız tamamlandı")

            ContextUtil.SetComplete()

 

        Catch ex As Exception

            MsgBox(ex.ToString)

 

        Finally

 

        End Try

 

 

 

    End Sub

 

Dll’leri oluşturduktan sıra bunları com+ tarafına atmaya geldi. Bunun için aşağıdaki makaleden yararlanabilirsiniz.

http://www.yazgelistir.com/makalegoster.aspx?id=282)

 

Bu aşamayı geçtikten sonra aşağıdaki görüntüyü elde ederiz.

 

 

Bu aşamadan sonra component’lerimizi transaction zincirine koymamız gerekmektedir. Burda dikkat etmemiz gereken nokta zinciri kimin başlatacağı ve kimin katılacağı yada destekleyeceği. Bizim senaryomuzda zinciri ikinci.dll içindeki ikinciuyg başlatacak ilkuyg ise devam ettirecektir. Bu ayarları com+ ekranında yapmak için aşağıdaki ayarları yapmamız gerekir.

 

İkinci dll’de  requires new yaparak yeni bir zincir başlatacağı belirlenir. Diğer ayarların açıklamaları aşağıdaki gibidir.

 

Disabled :  Com objesinin çalıştırılamayacağı

Not Supported : Transaction’ı desteklemeyeceği

Supported : Kendisini çağıran bir transaction’ı destekleyeceği

Required : Çalışması için başka bir transaction’a ihtiyaç duyacağı

Requires New : Yeni bir transaction başlatacağı

 

 

 

Yukarıdaki açıklamalardan anlaşılacağı üzere Birinci dll’de ise aşağıdaki ayarlar yapılmalıdır. Burada gelen zincire katılması için supported seçeneği seçilmelidir.

 

 

Tabi bu arada kodlarımızda ContextUtil.SetComplete kısmına dikkatinizi çekerim. Bu komutla evet bu kısım başarıyla tamamlandı demekteyiz. Transaction’daki tüm metotlar aynı komutu gönderdiğinde transaction başarı ile tamamlanmış olur. Aksi halde transaction yapılan tüm işlemleri geri alacaktır.

 

Şimdi kodlarımızı çalıştırırak yaptıklarımızı test edeceğiz.

 

 

Transaction’u izlemek için Transaction Coordiantor’dan yararlanıyoruz. İlk aşamada aşağıdaki duruma sahibiz.

 

 

Transaction Coordinatorun ilk durumuna bakalım. Bu durumda önceden çalıştırılan 6 transactiondan 4 ü başarı ile tamamlanmış 2 si başarısızlıkla sonuçlanmıştır.

 

 

Program çalıştırıldığında ise aşağıdaki pencere elde edilir. Bunun sonucunda veri tabanımıza iki metottan iki kayıt veritabanına işlenmiş olur.

 

 

Şimdi ise ikinci metotta hata üreterek çalıştıralım.  Bunun için kodlarımızda bulunan hata üretme kodunun önündeki yorum işaratini kaldırıp derlememiz yeterli olacaktır. Programı çalıştırdığımızda active olarak 1 transaction penceremize düşer. (committeki 1 artış ilk düğmeye önce basmamdan kaynaklanmıştır. Kafanızı karıştırmasın)

 

 

Yukarıdaki active transaction, programda hata üretilmesi ile birlikte aborted durumuna düşmektedir. Aşağıdaki pencere bu durumun bir kanıtıdır. Transaction’ın Abort olması ilk metodun başarılı olmasına rağmen ikincisi başarısız olduğu için tüm işlemlerin geri alması anlamına gelmektedir.

 

 

 

 

 

Transaction için meydana gelebilecek tüm olayları ayrıntılı bir şekilde açıkladığımıza inanıyorum. COM+ ın kullanılmasındaki faydaları örnekli olarak anlatmaya devam edeceğiz.

 

Atakan Kesler

atakan.kesler@bilgeadam.com