Makale Özeti

com+ da transaction ayarlarının örnekli anlatımı

Makale

Aynı Veriye Saldıran COM Objeler

Aynı Veriye Saldıran COM Objelerine Ne Yapmalı ?

 

COM+ ‘ın güvenlik , pooling ve transaction özelliklerine önceki makalelerimizde değinmiştik. Şimdi ise isolation seviyelerini inceleyeceğiz. Öncelikle neden ihtiyaç duyduğumuza bakalım. İki com objesinin aynı data üzerinde işlem yapmaya kalkıştığını düşünelim. Bu durumda ne olacak.?

Bu durumda aşağıdaki ayarlar devreye girecektir. Bunların neler olduğunu incelemeden önce örneğimize bakalım.

Class’ımızın içindeki  yordamın  kodları aşağıdaki gibidir. Bu yordamdaki amaç bir tablonun içine kayıt eklemektir.

 

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()

            Dim k As Integer

            k = cmd.ExecuteNonQuery()

            conn.Close()

            MsgBox(ContextUtil.TransactionId.ToString)

 

 

 

            MsgBox(ContextUtil.IsInTransaction())

            ContextUtil.SetComplete()

 

 

        Catch ex As Exception

            MsgBox(ex.ToString)

        End Try

Aynı class içinde aynı zamanda tablodaki verileri döndüren bir fonksiyon sözkonusu. Böylelikle aynı data üzerine oynayan iki fonksiyon sözkonusu olacktır.

 

 

 

_

    Public Function goster() As DataSet Implements kurallar.goster

        Dim b As String = "select * from deneme"

        Dim da As New SqlDataAdapter(b, conn)

        Dim ds As New DataSet

        da.Fill(ds, "ilk")

        Return ds

    End Function

 

Bundan sonra bize kalan bunları ayrı transactionlar üzerinde çalıştırmak. Bunun için aynı formu iki kere çalıştırmamız mantıklı olur. Tabi form tarafında kodlarımızı da unutmadan yazalım.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim b As New ikinci.ikinciuyg

        b.veriekleB()

    End Sub

 

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

        Dim b As New ikinci.ikinciuyg

 

 

        DataGrid1.DataSource = b.goster.Tables(0)

    End Sub

Son durum aşağıdaki şekilde olacaktır.

Şimdi uygulamamızı çalıştırmadan önce isolation level’ı read commit olarak ayarlıyoruz. Bu arada transaction support’u açmayı unutmayalım .

Şimdi uygulamamızı iki kere çalıştıralım ve aşağıdaki gibi iki transaction olmasını sağlayalım. İlk uygulamada ikinciveriekleB tuşuna basalım ve hemen sonra diğer formdaki veri göster’e tıklayalım birinci transaction bitene kadar veri gösterilmeyecektir. Aşağıda tranactionId verilerek birinci transaction’ın durması sağlanmıştır. Böylelikle ikinci düğmenin cevap vermediği gösterilmiştir.

Tahmin edeceğiniz gibi bu mesaj kutusu onaylandığında veriler de otomatik olarak yüklenecektir.

 

 

Şimdi onay kutusunu ok’leyelim ve sonucu görelim.

Burdaki durum READ COMMITED durumudur. Veri commited olmadığı için okuma işlemini yapamamıştır.

Şimdi ise READ UNCOMMITED olma durumuna bakalım. Bu durumda ise verinin commit olmasını beklemeden gösterebilecektir.

İki isolation seviyesini örnek üzerinde inceledik , geri kalanların açıklamaları aşağıdadır.

·         Serialized  Mevcut transaction tarafından okunan veri transaction bitene kadar değiştirilemez . O anki transaction’ı etkileyecek  yeni data eklenemez. En etkili transaction seviyesidir ve default olarak gelir.

·         Repeatable Read   Mevcut transaction tarafından okunan veri transaction bitene kadar değiştirilemez . Serialized’dan farkı  yeni data eklenebilmesidir.

·         Read Committed  Transaction’ı başarılı bir şekilde tamamlanmış verileri okuyabilir, başarısız olanları okuyamaz.

·         Read Uncommitted  Transaction tüm dataları okur, başka bir transaction tarafından değişiriliyor olsa bile. En düşük seviye isolation seviyesidir fakat en yüksek aynı zamanda çalışma sayısına sahiptir.

·         Any   Üst component’ten gelen transaction’la aynı seviyeden isolation seviyesine sahip olacaktır. Bu component root ise transaction isolation’ı serialized olacaktır.

COM+ la uygulamalarınızı nasıl kolaylaştırdığımızı önceki makalelerde görmüştük bu makalede ise önemli bir kolaylıktan bahsetmeye çalıştık. Bu uygulama ile karmaşık işlemleri nasıl basitleştirdiğimizi gördük.

 

Atakan Kesler

Atakan.kesler@bilgeadam.com