• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

WCFden, XML Web Servisine TransactionScope Activity Bileseni Uzerinden Transaction Aktarmak

WCFden, XML Web Servisine TransactionScope nesesini de kullanarak bir Activity Bileseni üzerinden nasıl Transaction aktarabileceğimizi incelemeye çalışıyoruz.

25.03.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: WCF

2731

1344349583_normalThumb[Örnek Visual Studio 2010, .Net Framework 4.0 tabanlidir]

Merhaba Arkadaslar,

Bir süre öncesine kadar Composition adi verilen bir katmanda yer alacak çesitli servisler ile yogun sekilde güresmekteydim. Çok fazla faktör, çok fazla farkli sistem ve tabiri yerinde ise oyun ve oyuncu söz konusuydu.

WCF servisleri, XML Web Servisleri, Java tabanli olanlari ve belki de yarin gelecek olan çesitli COM bilesenleri, 3ncü parti uygulamalar, koduna müdahale edemeyecegimiz programlar vs.

Sadece bunlar olsa iyi. Bir de bunlar içerisine Oracle üzerinde kosan Transactional veritabani islemleri de mevcut olunca, isler ister istemez karisiyor ve künde pozisyonuna geliyorsunuz. Nitekim bu servisler n sayida kombinasyon ile birbirleriyle etkilesimde bulunabilirler ve bu tip senaryolarda bir sekilde Distributed Transaction terminolojisinin uygulanmasi ve servisler arasinda basarili bir sekilde akitilarak, Two Phase Commit ilkesinin gerçeklestirilebiliyor olmasi gereklidir.

Daha önceden ele aldigimiz bir yazida, WCF servislerinin Workflow tarafindaki TransactionScope kontrolüne dahil edilme durumlarini incelemeye çalismistik hatirlayalim.

Workflow Foundation, Oracle, WCF ve TransactionScope

Senaryo

Bu seferki senaryomuz biraz daha farkli ve karışık Confused smile Elimizde iki adet servis bulunmakta. Her ikisi de kendi içerisindeki operasyonlarinda, Oracle tabanli bir veritabani üzerine insert islemi gerçeklestirmekte(Senaryo geregi insert, ama tabiki her tür CRUD operasyonu söz konusu olabilir)

Ne varki bu servislerden birisi Windows Communication Foundation yapisinda iken digeri eski XML Web Service formatinda tasarlanmis durumdalar. Senaryomuzda bu iki servisi kendi bünyesinde birlestiren bir de Workflow Activity bulunuyor. Çok dogal olarak bu bilesenin içerisinde ele alacagimiz bir TransactionScope kontrolü de yer almakta. Hal böyle olunca TransactionScope içerisinde üretilen Transaction’ in servisler arasinda nasil akacagi, büyük soru isareti olarak karsimiza çikiyor. Aslinda senaryoyu asagidaki sekle bakarak kafamizda daha iyi canlandirabilecegimizi düsünüyorum.

WP_000637

WCF servislerinin kullanildigi senaryolarda atomic transaction’ larin servis içerisine nasil akitilacagini bu yazimizda incelemistik hatirlayacaginiz üzere. Ancak isin içerisine eski stilde yazilmis bir XML Web Service girince, durum biraz farklilasiyor Who me?

Ne yazik ki, istemci tarafinda baslatilan Transaction’ in kod yardimiyla XML Web Service içerisindeki ilgili Web Method’ a aktarilmasi gerekmektedir. Aksi durumda bir çalisma zamani hatasi alinmiyor olmasina karsin, bir dagitik Transaction’ in ilgili Web Method içerisindeki CRUD(Create Retrieve Update Delete) islemini ele alamadigi görülür. Bu görünmez hata fark edilmedigi takdirde, kötü sonuçlara neden olabilir tahmin edeceginiz üzere.

Örnek

Öyleyse gelin yola koyulalim ve adim adim Solution içerigimizi insa ederek teste çikalim. Çözümümüz içerisinde bir ortak fonksiyonellik kütüphanesi, bir WCF Servis uygulamasi, bir XML Web Servis içeren Asp.Net Web uygulamasi ve son olarak da bir adet Workflow Console projesi bulunmakta.

htt_4

Ilk olarak WCF servis tarafini gelistiriyor olacagiz.

Servis sözlesmesi

using System.ServiceModel;

namespace WcfService1
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [TransactionFlow( TransactionFlowOption.Mandatory)]
        int InsertAccount(int accountId, string name, string surname);
    }
}

Servis kodlari

using System.Configuration;
using System.ServiceModel;
using System.Transactions;
using CommonLibrary;
using Oracle.DataAccess.Client;

namespace WcfService1
{
    public class Service1
        : IService1
    {
        [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public int InsertAccount(int accountId,string name,string surname)
        {
            int result = 0;

            Utility.Log(Transaction.Current);

            using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
            {
                using (OracleCommand command = new OracleCommand("INSERT INTO ACCOUNT (ACCOUNTID,NAME,SURNAME) VALUES (:pACCOUNTID,:pNAME,:pSURNAME)", conn))
                {
                    command.Parameters.Add(":pACCOUNTID", accountId);
                    command.Parameters.Add(":pNAME", name);
                    command.Parameters.Add(":pSURNAME", surname);

                    conn.Open();
                    result = command.ExecuteNonQuery();
                }
            }

            return result;
        }
    }
}

Servis Konfigurasyon içerigi

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="ConStr" connectionString="User Id=...;Password=...;Data Source=..." providerName="Oracle.DataAccess.Client"/>
    </connectionStrings>
    <system.serviceModel>
        <services>
            <service name="WcfService1.Service1">
                <endpoint address="http://localhost:12809/Service1.svc"
                  binding="wsHttpBinding" bindingConfiguration="wsB" contract="WcfService1.IService1" />
            </service>
        </services>
        <bindings>
            <wsHttpBinding>
               <binding transactionFlow="true" name="wsB"/>
            </wsHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/>
    </system.serviceModel>
</configuration>

Servis metodu Account isimli bir tabloya veri girisi islemini icra edecek sekilde tasarlanmistir. wsHttpBinding baglayici tipini kullanmaktadir. Oracle üzerinde bir veri islemi söz konusu olmasi nedeniyle ODP.Net’ in ilgili versiyonu ele alinmistir.

Bu servis uygulamasinda ve takip eden kod satirlarinda belirtecegimiz XML Web Service  uygulamasinda, güncel Transaction bilgilerini fiziki bir dosyaya loglamak amaciyla bir kütüphane fonksiyonundan yararlanilmaktadir. Utility sinifina ait static Log metodunun içerigi asagidaki gibidir.

Log bilgisinin en önemli parçalarindan birisi de DistributedIdentifier özelliginin degeridir. Bu deger ilk baslatildigi noktada ne ise, diger servis çagrilari içerisinde de ayni olmalidir ki ortak bir dagitik transaction yapisindan söz edilebilsin.

using System.IO;
using System.Transactions;

namespace CommonLibrary
{
    public class Utility
    {
        public static void Log(Transaction current)
        {
            if (current != null)
            {
                var information = Transaction.Current.TransactionInformation;
                string report = string.Format("Time:{0},Isolation Level:{1},Distributed ID:{2},Local ID:{3},Status:{4}\n"
                    , information.CreationTime
                    , Transaction.Current.IsolationLevel.ToString()
                    , information.DistributedIdentifier.ToString()
                    , information.LocalIdentifier
                    , information.Status
                    );
                File.AppendAllLines("c:\\Log.txt", new string[] { report });
            }
        }
    }
}

Gelelim XML Web Service tarafina. Eminim ki uzun süredir bir XML Web Servis yazmiyor veya tüketmiyorsunuzdur Winking smile Ama çalistiginiz kurum da eski sistemler söz konusu ise bundan kaçis yolunuz olmadigini ifade edebilirim.

XML Web Servis kodlari

using System.Configuration;
using System.EnterpriseServices;
using System.Transactions;
using System.Web.Services;
using CommonLibrary;
using Oracle.DataAccess.Client;

namespace WebApplication1
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod(TransactionOption= TransactionOption.Required)]
        public int InsertBranch(int branchId, string title, int code,byte[] propToken)
        {
            int result = 0;

            Transaction tx = TransactionInterop.GetTransactionFromTransmitterPropagationToken(propToken);
            using (TransactionScope scope = new  TransactionScope(tx))
            {
                Utility.Log(Transaction.Current);

                using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
                {
                    using (OracleCommand command = new OracleCommand("INSERT INTO BRANCH (BRANCHID,TITLE,CODE) VALUES (:pBRANCHD,:pTITLE,:pCODE)", conn))
                    {
                        command.Parameters.Add(":pBRANCHID", branchId);
                        command.Parameters.Add(":pTITLE", title);
                        command.Parameters.Add(":pCODE", code);

                        conn.Open();
                        result = command.ExecuteNonQuery();
                        //throw new Exception("Some error");
                    }
                }
                scope.Complete();
            }

            return result;
        }        
    }
}

Branch tablosuna insert islemini icra eden InsertBranch web metodu içerisindeki en önemli kisim, parametre olarak gelen byte[] tipindeki propToken degiskeninin kullanilis seklidir. Dikkat edilecegi üzere bu degisken degerinden yararlanilarak istemci tarafindan gelen dagitik transaction tipi yakalanmakta ve onu baz alacak sekilde bir TransactionScope blogu üretilmektedir. Bu sayede istemci tarafindaki Transaction Scope’ un baslattigi dagitik transaction’ a dahil olunabilecektir.

Pek tabi kodumuz içerisinde daha sonradan yapacagimiz testler için ele alacagimiz bir yorum satiri vardir Winking smile Amaç olarak ilgili satiri test sirasinda açip bu web servis ve öncesinden gelen WCF servisi içerisindeki veritabani operasyonlarinin rollback edildigini görmek istiyoruz.

Istemci Tarafi

Öyleyse gelelim istemci tarafina. Istemci uygulamamiz bildiginiz üzere bir Workflow çagrisi gerçeklestiriyor olacak. Bu sebepten bir Workflow Console Application projesinden yararlanabiliriz. Söz konusu projeye hem WCF hem de XML Web servislerini referans olarak eklememiz gerekiyor.

XML Web Service referansini eklemek için Add Service Reference->Advanced sekmesine geçip oradaki Add Web Reference dügmesini kullanmaniz gerektigini unutmayin. Yoksa Web Servisinizi de WCF servis gibi eklenmis bulursunuz.

Workflow uygulamamizda asagidaki TransactionScope bilesenini içeren bir Flow Chart söz konusudur.

htt_1

Akisa ait XAML içeriginde özellikle bold olan alanara dikkat edin. Örnegi yazarken isinize yarayacaktir.

<Activity mc:Ignorable="sads sap" x:Class="WorkflowConsoleApplication1.Activity1" sap:VirtualizedContainerService.HintSize="654,676" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation"
xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:WorkflowConsoleApplication1"
xmlns:local1="clr-namespace:WorkflowConsoleApplication1.WcfServiceReference1.Activities"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System"
xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities"
xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:s1="clr-namespace:System;assembly=System"
xmlns:s2="clr-namespace:System;assembly=System.Xml"
xmlns:s3="clr-namespace:System;assembly=System.Core"
xmlns:s4="clr-namespace:System;assembly=System.ServiceModel"
xmlns:sa="clr-namespace:System.Activities;assembly=System.Activities"
xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities"
xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger"
xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
xmlns:sc="clr-namespace:System.ComponentModel;assembly=System"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System"
xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel"
xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core"
xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib"
xmlns:sd="clr-namespace:System.Data;assembly=System.Data"
xmlns:sl="clr-namespace:System.Linq;assembly=System.Core"
xmlns:st="clr-namespace:System.Text;assembly=mscorlib"
xmlns:ww="clr-namespace:WorkflowConsoleApplication1.WcfServiceReference1"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Flowchart sad:XamlDebuggerXmlReader.FileName="d:\users\bsenyurt\documents\visual studio 2012\Projects\HowTo_AtomicTransactions\WorkflowConsoleApplication1\Activity1.xaml" sap:VirtualizedContainerService.HintSize="614,636">
    <Flowchart.Variables>
      <Variable x:TypeArguments="x:Int32" Name="InsertAccountExceuteResult" />
      <Variable x:TypeArguments="x:Int32" Name="InsertBranchExecuteResult" />
    </Flowchart.Variables>
    <sap:WorkflowViewStateService.ViewState>
      <scg3:Dictionary x:TypeArguments="x:String, x:Object">
        <x:Boolean x:Key="IsExpanded">False</x:Boolean>
        <av:Point x:Key="ShapeLocation">270,2.5</av:Point>
        <av:Size x:Key="ShapeSize">60,75</av:Size>
        <av:PointCollection x:Key="ConnectorLocation">300,77.5 300,160.5</av:PointCollection>
      </scg3:Dictionary>
    </sap:WorkflowViewStateService.ViewState>
    <Flowchart.StartNode>
      <FlowStep x:Name="__ReferenceID0">
        <sap:WorkflowViewStateService.ViewState>
          <scg3:Dictionary x:TypeArguments="x:String, x:Object">
            <av:Point x:Key="ShapeLocation">195,160.5</av:Point>
            <av:Size x:Key="ShapeSize">210,59</av:Size>
          </scg3:Dictionary>
        </sap:WorkflowViewStateService.ViewState>
        <TransactionScope sap:VirtualizedContainerService.HintSize="266,396">
          <sap:WorkflowViewStateService.ViewState>
            <scg3:Dictionary x:TypeArguments="x:String, x:Object">
              <x:Boolean x:Key="IsExpanded">True</x:Boolean>
            </scg3:Dictionary>
          </sap:WorkflowViewStateService.ViewState>
          <Sequence sap:VirtualizedContainerService.HintSize="230,315">
            <sap:WorkflowViewStateService.ViewState>
              <scg3:Dictionary x:TypeArguments="x:String, x:Object">
                <x:Boolean x:Key="IsExpanded">True</x:Boolean>
              </scg3:Dictionary>
            </sap:WorkflowViewStateService.ViewState>
            <local1:InsertAccount sap:VirtualizedContainerService.HintSize="208,22" InsertAccountResult="[InsertAccountExceuteResult]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" accountId="9000" name="Burak" surname="Senyurt" />
            <InvokeMethod sap:VirtualizedContainerService.HintSize="208,129" MethodName="InsertBranchFromWebService" TargetType="local:Excecuter">
              <InvokeMethod.Result>
                <OutArgument x:TypeArguments="x:Int32">[InsertBranchExecuteResult]</OutArgument>
              </InvokeMethod.Result>
              <InArgument x:TypeArguments="x:Int32">8888</InArgument>
              <InArgument x:TypeArguments="x:String">Çinaralti</InArgument>
              <InArgument x:TypeArguments="x:Int32">40</InArgument>
            </InvokeMethod>
          </Sequence>
        </TransactionScope>
      </FlowStep>
    </Flowchart.StartNode>
    <x:Reference>__ReferenceID0</x:Reference>
  </Flowchart>
</Activity>

Ne yazik ki XML Web Service’ ler referans olarak bir Workflow projesine eklendiklerinde, Toolbox üzerinde ayni WCF Servislerinde oldugu gibi bir component olarak görülmemektedir. Tabi bunu Visual Studio 2012 için konustugumuzu tekrardan hatirlatalim. (Eskiye olan support’ un kalktigini bu noktada bariz bir sekilde görebiliriz aslinda Sad smile )

htt_5

Dolayisiyla ilgili XML Web Servis’ ini çagirmak için belki bir InvokeMethod bileseninden yararlanabiliriz ki o da içeride static bir tip metodu kullanacaktir. Bu metod Executer isimli sinif içerisinde asagidaki gibi tanimlanmistir.

using System.Transactions;
using WorkflowConsoleApplication1.localhost;

namespace WorkflowConsoleApplication1
{
    public class Excecuter
    {
        public static int InsertBranchFromWebService(int branchId,string title,int code)
        {
            WebService1 service = new WebService1();
            byte[] propToken = TransactionInterop.GetTransmitterPropagationToken(Transaction.Current);
            return service.InsertBranch(branchId, title, code, propToken);
        }
    }
}

Metoda ait kod içerigi oldukça kritiktir. Görüldügü üzere TransactionInterop tipinin static GetTransmitterPropagationToken metoduna o anki Transaction nesne örnegi gönderilerek bir byte dizi içeriginin elde edilmesi söz konusudur. Bu sekilde, aslinda TransactionScope bileseni içerisine dahil olan ve WCF Servis çagrisi yoluyla baslatilan Transaction’ in XML Web Servis metodu içerisine parametre olarak bildirilebilmesi mümkün hale gelmektedir.

Workflow Console uygulamasinin Main metoduna ait içerik ise son derece standarttir.

using System;
using System.Activities;

namespace WorkflowConsoleApplication1
{

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Activity wf = new Activity1();
                WorkflowInvoker.Invoke(wf);
            }
            catch (Exception excp)
            {
                Console.WriteLine(excp.Message);
            }
        }
    }
}

Testler

Artik testlerimize baslayabiliriz. Senaryoyu dogrudan bu sekilde islettigimizde, C dizini altinda üretilen Log.txt dosyasinda asagidakine benzer bir içerigin olusturulacagi gözlemlenecektir.

Time:09.08.2012 09:28:45,Isolation Level:Serializable,Distributed ID:2cef4851-a7fe-41e3-a42a-cf4aab1aa9fe,Local ID:632e8dc4-5446-4531-9426-05f092527d54:1,Status:Active

Time:09.08.2012 09:28:45,Isolation Level:Serializable,Distributed ID:2cef4851-a7fe-41e3-a42a-cf4aab1aa9fe,Local ID:16135af3-ce46-42c3-9acf-ec5dc5d43275:1,Status:Active

Bu çiktilardan ilki WCF servis metodu, ikincisi ise XML Web Servis metodu içerisinde gelmektedir. Dikkat edilecegi üzere her iki çagri içinde ayni Distributed Transaction ID degeri üretilmistir. Eger veritabanina gidilirse, icra edilen insert islemlerinin her iki tablo içinde basarili bir sekilde yapildigi görülebilir.

htt_2

Åžimdi XML Web servis metodu içerisindeki sihirli yorum satirimizi açalim ve testimizi tekrardan yapalim. Çalisma ortamina düsen exception mesaji asagidaki gibi olacaktir. TransactionScope kontrolünün AbortInstanceOnTransactionFlow özelliginin degeri varsayilan olarak true oldugundan, Web Servis içerisinden gelen Fault Exception nedeni ile, akisa ait nesne örneginin çalismasi otomatikman durdurulmustur.

htt_3

Log içerigine bakildiginda ise Distribute Transaction’ in yine basarili bir sekilde olusturuldugu ve her iki servis çagrisinda da, ayni ID degerlerini kullanildigi görülebilir.

Time:09.08.2012 09:32:35,Isolation Level:Serializable,Distributed ID:6dd28d89-aa10-4a97-8b32-e3439f0374ff,Local ID:632e8dc4-5446-4531-9426-05f092527d54:2,Status:Active

Time:09.08.2012 09:32:35,Isolation Level:Serializable,Distributed ID:6dd28d89-aa10-4a97-8b32-e3439f0374ff,Local ID:384682c2-e4e1-47af-bc8e-f28c5abd7229:1,Status:Active

Ancak veritabanina gidilip ilgili tablolar sorgulandiginda, iki Insert isleminin de yapilmadigi gözlemlenecektir. Bir baska deyisle istedigimiz durum olusmus ve Transaction islemleri Abort edilerek o ana kadar yapilan ne kadar veritabani islemi var ise onaylanmamistir Open-mouthed smile

Görüldügü üzere biraz kodlama yardimiyla WCF ve XML Web Servislerini, TransactionScope bileseni içerisinde bir arada kullanabildik. Tabiki senaryonun genisletilmesi ve gelistirilmesi gerekiyor. Örnegin Savepoint kullanimlari durumu var. Ya da Long Running Process söz konusu ise Persistence sisteminin bu tip vakalarda nasil tepki verecegi. Hatta daha da zor bir senaryo var. Ya bu XML Web Service’ ler daha önceden yazilmislar ve sizin müdahale alaniniz disindaysalar Confused smile Åžimdilik bu kötü kokan vakalari bir kenara birakip önümüze bakalim derim. Böylece geldik bir yazimizin daha sonuna. Tekrardan görüsünceye dek hepinize mutlu günler dilerim.

HowTo_AtomicTransactions.zip (117,25 kb)

[Örnek Visual Studio 2010, .Net Framework 4.0 tabanlidir]

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 2731izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 122279
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 68588
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 50137
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ