wmismail Posted August 10, 2008 Share Posted August 10, 2008 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 www.yazgelistir.comdaki 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.EnterpriseServices Imports 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. <Assembly: AssemblyKeyFile("f:\comp.snk")> <Assembly: ApplicationActivation(ActivationOption.Library)> <Assembly: ApplicationName("ComPlus Transaction")> <Assembly: Description("Transaction")> <ConstructionEnabled(default:="Merhaba", enabled:=True)> _ 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 Function End 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. <ConstructionEnabled(default:="Merhaba", enabled:=True), _ Transaction(TransactionOption.Required, Timeout:=120, Isolation:=TransactionIsolationLevel.Serializable)> _ 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 Sub End 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.Componentim Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show(compum.KurucuVer) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click compum.Insert1() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click compum.Insert2() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click compum.Submit() End Sub Private 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.