TransactionScope ile Transaction Yönetimi

Transaction yönetimi iş uygulamalarında çok önemlidir. .NET’te System.Transactions altında TransactionScope sınıfı ile transaction yönetimi kolay ve güvenli bir şekilde yapılabilmektedir.

  • Console Application oluşturulur.
  • Projede References > Add Reference… > Assemblies > Framework > System.Transactions seçilir ve eklenir.
  • Projeye aşağıdaki Class eklenir.
    MoneyPayTransaction.cs

    using System;
    using System.Transactions;
    
    namespace TransactionTest
    {
        public class MoneyPayTransaction : IEnlistmentNotification
        {
            public MoneyPayTransaction()
            {
                // İşlem transaction olarak kaydedilir.
                Transaction.Current.EnlistVolatile(this, EnlistmentOptions.None);
            }
    
            public void Commit(Enlistment enlistment)
            {
                Console.WriteLine("Commit.");
    
                // İşlem onaylanır.
    
                enlistment.Done();
            }
    
            public void InDoubt(Enlistment enlistment)
            {
                Console.WriteLine("InDoubt.");
    
                // İşlem bilinmez bir durumda kalır.
    
                enlistment.Done();
            }
    
            public void Prepare(PreparingEnlistment preparingEnlistment)
            {
                Console.WriteLine("Prepare.");
    
                // İşlem kaydı hazırlığı yapılır.
    
                preparingEnlistment.Prepared();
            }
    
            public void Rollback(Enlistment enlistment)
            {
                Console.WriteLine("Rollback.");
    
                // İşlem geri sarılır.
    
                enlistment.Done();
            }
        }
    }
    
  • Program.cs sınıfı aşağıdaki gibi değiştirilir.
    using System;
    using System.Transactions;
    
    namespace TransactionTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    Test();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Console.ReadKey();
            }
    
            static void Test()
            {
                using (TransactionScope ts = new TransactionScope())
                {
                    var mpt = new MoneyPayTransaction();
    
                    // İşlem yapılır.
    
                    while (true)
                    {
                        Console.Write("Transaction başarılı olsun mu? [Y|N]");
                        var c = Console.ReadKey();
                        Console.WriteLine();
    
                        if ((c.KeyChar == 'Y') || (c.KeyChar == 'y'))
                        {
                            ts.Complete();
                            break;
                        }
                        else if ((c.KeyChar == 'N') || (c.KeyChar == 'n'))
                        {
                            break;
                        }
                    }
                }
            }
        }
    }
    

TransactionScope çalışma mantığı şu şekildedir:

  • Eğer Complete çağrılmış ise işlemi tamamlamak için MoneyPayTransaction sınıfından Prepare ve Commit metotları otomatik olarak çağrılır.
  • Eğer Complete çağrılmamış ve TransactionScope dışına çıkılmış ise işlemi geriye sarmak için MoneyPayTransaction sınıfından Rollback metodu otomatik olarak çağrılır.

Leave a Reply

Your email address will not be published. Required fields are marked *