Com+ da transaction yaparken Veritabanın kilitlenmesi

Com+ da transaction yaparken Veritabanın kilitlenmesi

Com+ da ayrı veritabanlarına olan transactionları tek bir transaction da toplayabilir ve işiniz bitene kadar Veritabanına kimsenin erişememesini sağlayabilirsiniz.

Amacımız Com+ daki transaction ı anlatmak olduğu için çok fazla Com+ ile ilgili bilgiye girmeyeceğim. bu konular ile ilgili bilgiyi diğer dökümanlarda bulabilirsiniz.

Bir tane Windows Application oluşturun adına WinComTrans yazın ve hemen bu solutiona yeni bir proje daha ekleyin, yeni ekleyeceğiniz projede Class Library türünden olmalı, bu projeninde adına ComTrans yazın. Bir Com+ nesnesi yazacağımız için oluşturduğumuz Class Library nin referanslarına System.EnterpriseServices ı ekleyin, daha sonra Classımıza şu iki asssembly i import edin.

Imports System.EnterpriseServicesImports System.Reflection

ilk import ettiğimiz Namespace bizim Com+ nesnemizi oluşturmak için gerekli olan Namespace dir. ikincisi ise bizim assembly mizi sekillendirmemiz için gerekli olan bazı yapıları getirir. (örneğin az sonra class ın başında tanımlayacağımız Assembly gibi.)

Adım adım başlayalım, ilk yapacağımız iş Com+ nesnemizin kurucusu dediğimiz Constructor ını oluşturmak, Constructor kavramı bizim Com+ nesnemiz oluşturulurken kullanabileceğimiz bir değişkendir. şimdi Com+ ımızı ve kurucu nesnemizi oluşturalım. aşağıdaki kodları ComTrans projesindeki class dosyasına yazın.

_Public Class Componentim    Inherits ServicedComponent    Private kurucuMetin As String    Protected Overrides Sub Construct(ByVal s As String)        kurucuMetin = s    End Sub    Public Function KurucuVer() As String        Return kurucuMetin    End FunctionEnd Class

tek tek anlatmaya başlayalım, ilk 4 satırda Com+ nesnemiz ile ilgili tanımlamalar yaptık, eğer yazılan bir kod "<" ile başlayıp ">" ile bitiyorsa biz bunlara attribute (Özellik) diyoruz, bu kavram derleyiciye kodu derlerken bazı bilgiler vermeye ve kodu derlerken dikkat etmesi gereken noktaları anlatır. ilk verdiğim parametre AssemblyKeyFile parametresi, bu parametre Strong Name kullanabilmemiz için oluşturulmuş olan anahtar dosyasını gösteriyor. bu anahtar dosyayı Visual Studio .Net ile gelen Command Promttan "sn -k dosyaAdi.snk" komutu ile oluşturabilirsiniz. ikinci satırdaki komut ise Com+ nesnemizin türünü anlatıyor. temel olarak iki türlü Com+ nesnesi vardır. birincisi Server türüdür. Server türü Com+ nesnemizi Distrubuted (dağıtık denilen yani nesneye başka bir makineden ulaşılacaksa...) yapacaksak kullanacağımız türdür. ikinci tür olan Library türü ise bu Com+ nesnesinin local makineden kullanılabileceiğini anlatır. üçüncü satırda Com+ nesnesinin ismi dördüncü satırda ise bu nesnenin açıklaması vardır.

Daha sonra Com+ nesnemizin ilk Componentini oluşturuyoruz. (Public Class Componentim bölümü) dikkat edilmesi gereken husus, ServicedComponent tan türetilmesi gerektiğidir. dikkat ettiyseniz burada ben Componentimi tanımlarken attribute kullandım. kullandığım Attribute Com+ nesnemin kurucusu olarak geçen ve sadece tek bir metin tanımlayabildiğim bir Classıdır. ConstructionEnabled, iki parametre alıyor, bunlardan ilki default parametresi. bu parametre değişkende hangi değerin tutlacağını anlatır. ikincisi ise bu kurucu yöntemin aktif olup olmadığını anlatan enabled parametresidir. Overrides türden tanımlanmış Construct metodu parametre olarak s yi alır ve bu s parametresi aslında benim ConstructionEnabled a verdiğim Default parametresindeki değerdir. ben bu değeri tutabilmek için bir tane string türden kurucuMetin değişkeni tanımladım ve bu değişkene s deki değeri atadım ve bu kurucuMetin değerini geri döndürmesi için KurucuVer fonksiyonunu tanımladım.

şimdi Windows Application a geçin, References klasörüne sağ tuş ile tıklayın ve Add References ı seçin, açılan diyalog kutusundan Project bölümüne geçin ve orada olan ComTrans ı referanslarınıza ekleyin. daha sonra formunuza bir buton ekleyin ve bu nesneyi oluşturup kurucu metni alması için aşağıdaki kodları yazın.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click    Dim compum As ComTrans.Componentim = New ComTrans.Componentim    MessageBox.Show(compum.KurucuVer)End Sub

Butona bastığınızda oluşmuş olan Com+ nesnenize Start -> Run dan dcomcnfg yazarak bakabilirsiniz.

Kurucu Elemanı görmek için ise Componentinize sağ tuş tıklayıp Properties yapın.

Şimdi esas işimize başlayalım. Transaction işlemi, kodunuzu aşağıdaki hale getirin, Yukarıya System.Data.SqlClient ı import etmeyi unutmayın.

_Public Class Componentim    Inherits ServicedComponent    Private kurucuMetin As String    Private conn1 As New SqlConnection("data source=(local); integrated security=sspi; initial catalog=deneme;")    Private conn2 As New SqlConnection("data source=(local); integrated security=sspi; initial catalog=northwind;")    Private cmd1 As New SqlCommand    Private cmd2 As New SqlCommand    Protected Overrides Sub Construct(ByVal s As String)        kurucuMetin = s    End Sub    Public Function KurucuVer() As String        Return kurucuMetin    End Function

    Protected Overrides Sub Activate()        conn1.Open()        cmd1.Connection = conn1        conn2.Open()        cmd2.Connection = conn2    End Sub    Protected Overrides Sub Deactivate()        conn1.Close()        conn2.Close()    End Sub

    Public Sub Insert1()        cmd1.CommandText = "insert into kisiler (ad,soyad) values (Cenk,Caglar)"        cmd1.ExecuteNonQuery()    End Sub    Public Sub Insert2()        cmd2.CommandText = "insert into categories (CategoryName, Description) values (Levent,Cenk)"        cmd2.ExecuteNonQuery()    End Sub

    Public Sub Submit()        ContextUtil.SetComplete()    End Sub    Public Sub Rollback()        ContextUtil.SetAbort()    End SubEnd Class

Kod biraz uzun oldu farkındayım :) ama çok çok önemli bir amaca hizmet ediyor :) şimdi yeni eklediğimiz bölümleri tek tek açıklayalım. ilk olarak eklediğimiz Trancastion attribute ünü inceleyelim. üç parametresi var, ilk parametresi TransactionOption parametresi bu parametre Transaction işlemlerinde bu bileşenimizin nasıl davranacağını anlatır. ben Required olarak tanımladım, yani ihtiyaç duyar, eğer katılabileceği bir transaction varsa ona katılır yoksa kendisi yeni bir transaction yaratır demek. (bundan başka 4 tane daha opsiyonu var, inceleyebilirsiniz.) İkinci parametre ise Transaction ın Timeout olması, yani ne kadar süre geçerse Transaction ın kendi kendini iptal etmesi gerektiği. üçüncü parametremiz esas işi yapan parametremiz, IsolationLevel ı, yani veritabannı kilitleyecek olan parametremiz. bunun haricinde 4 opsiyonu daha var onlarıda tek tek deneyebilirsiniz.

4 tane değişken tanımladım bu değişkenlerden ikisi SqlConnection değişkenleri, burada ben uygulamayı daha kolay yazabilmek için kendi makinemdeki yani localdeki Sql Server 2000 i kullandım ama siz farklı lokasyondaki farklı Sql Server ları kullanabilirsiniz. iki tanede SqlCommand var bu Command larda aşağıdaki kodlarda işi yapacak olan değişkenler.

Daha sonra Overrides olarak tanımlanmış Activate metodu var, bu  metot Com+ nesnesi istendiğinde otomatik olarak çalışır, aslında bir çeşit kurucu metottur (Classın kurucu metodu olan Sub New ile karıştırmayınız, burada nesne oluşturulmuş durumda sadece çağrıldığında oluşturulan metotun kopyası alınırken çalışan bir durum.). Activate metodunun hemen altında Deactivate metodu mevcut, bu metotta Activate metodunun tersini yapıyor, yani nesnenin işi bittiğinde çalışıyor (eğer ObjectPooling yaptıysanız nesnenin havuzdan çıkartıldığı ve işi bittiğinde geri havuza yerleştirildiğindede bu metotlar çalışır.). Sonraki iki metot Insert1 ve Insert2 metodu, bu metotları ben Windows Formumdan çağaracağım ve SqlCommandlardaki insert cümleciklerinin çalıştırılmasını sağlayacağım. Son iki metodumuz ise Submit ve Roolback metotlarımız, yani SqlCommandların oluşturduğu transaction ları Commit yada RollBack etmeye yarıyacak olan metotlar, ContextUtil Classı Com+ nesnemi saran ve Transaction gibi bir çok işlemi yapmasını sağlayacak olan Class dır. SetComplete metodu Commit etmeye, SetAbort metodu ise RollBack etmeye yarar.

Eğer Connection String lerde dikkat ettiyseniz ilk Veritabanım deneme isimli veritabanım hemen Sql Server inizin Enterprise Manager ını açıp deneme isimli bir veritabanı yaratın ve bu veri tabanına kisiler isimli bir tablo ekleyin, bu tablonunda sadece iki tane sütunu olması yeterli, ilk sütun ad ikinci sütun ise soyad sütunu, nvarchar 20 tanımlamanız yeterli Primary Key gibi diğer özelliklere ihtiyac yok.

Şimdi sırada Windows formumuzu düzenlemek var, zaten 1 tane buton koymuştuk, 4 tane daha buton yerleştirin

Şimdi her Butonun işi için kodlarımızı yazalım, Windows Formunuzun kodlarını aşağıdaki gibi düzenleyin.

Dim compum As ComTrans.Componentim = New ComTrans.ComponentimPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click    MessageBox.Show(compum.KurucuVer)End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click    compum.Insert1()End SubPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click    compum.Insert2()End SubPrivate Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click    compum.Submit()End SubPrivate Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click    compum.Rollback()End Sub

Şimdi geldik işin eğlenceli yanına, programı çalıştırmaya, programınızı çalıştırıken bir yandanda yine Start -> Run dan dcomcnfg yazın, böylece transactionları daha rahat görebileceğiz. aşağıdaki resimden nereye bakacağınızı görebilirsiniz, Transaction Statistics e tıklayın. (eğer çalıştırırken herhangi bir hata alırsanız Com+ nesnenizi silip tekrar çalıştırın, hata çıkmayacaktır.)

Gördüğünüz gibi şu anda aktif olan bir transaction yok (Active bölümü) formunuzdan insert1 e tıklayın, hemen sonra tekrar Transaction Statistics e bakın aktif olan bir tane göreceksiniz.

Daha sonra yine formunuzdan Insert2 ye tıklayın, yeni bir transaction açılmayacak varolan transaction a bu yeni transaction ınınız eklenecektir. Böyle iki farklı veri kaynağına yapılacak işleri tek bir Transaction a bağlamış olduk. Daha Commit yada RollBack etmediğimiz için Transaction ımız hala aktif, bu haldeyken Sql Server Enterprise Manager ı açıp kullanımda olan tablolardan birisini Select etmeye çalışın, karşınıza aşağıdaki gibi bir ekran gelecek :) yani sizin Transactionınınz Commit yada RollBack edilmeden herhangi birisi Veritabanından veri bile çekemeyecek.

Eğer Commit ederseniz iki tabloya ayrı ayrı datalar yazılacak, ama eğer RollBack ederseniz iki tabloyada hiç birşey yazılmayacaktır. Commit ettiğiniz veya RollBack ettiğiniz bütün Transactionlarınız Transaction Statistics bölümünde görüntülenecektir.

Böylece Com+ ın .Net e göre olan artılarından bir tanesini incelemiş olduk, farklı Transactionları tek bir transactionmış gibi gösterme özelliği. Özellikle bankasal işlemlerde çok fazla işe yarayabilecek bir örnek oluşturmaya çalıştım, yani a bankasından paranızı b bankasına transfer etmeye çalışırken bir problem oldu ve a bankasındaki transaction ınız ile b bankasındaki transaction ınız aynı transaction da olduğu için bir kere RollBack ettiğinizde ikisinden birden RollBack edilmesi gibi. Herhangi bir probleminizde bana mail yollayabilirsiniz.

Döküman Arama

Başlık :

Kapat