سطوح تراکنش و ایزوله (Transaction And Isolation Levels) در WCF

جمعه 16 بهمن 1394

در این مقاله قصد داریم تراکنش و ایزوله درWCF را مورد بحث قرار دهیم. در مقاله قبل به بحث امنیت در WCF پرداختیم. در اینجا سطوح تراکنش و ایزوله سازی را بررسی و پیاده سازی خواهیم کرد.

سطوح تراکنش و ایزوله (Transaction And Isolation Levels) در WCF

در این مقاله قصد داریم  تراکنش و ایزوله در را مورد  WCF بحث قرار دهیم. در مقاله قبل به بحث امنیت در  WCF پرداختیم. در اینجا سطوح تراکنش و ایزوله سازی را بررسی و پیاده سازی خواهیم کرد.

Transaction یا تراکنش :

یک واحد منطقی است که دارای مجموعه ای از عملیات ها می باشد که همگی موفقیت آمیز هستند یا همگی با شکست مواجه می شوند و چیزی بین این دو وضعیت وجود ندارد. به طور مثال پرداخت حقوق به حساب شما ، که یک عملیات واریز به میزان حقوق شما به حسابتان را افزایش می دهد و به همان میزان از حساب شرکت کاسته می شود. هر دو عملیات باید با هم انجام شوند در غیر اینصورت هر دو با مشکل مواجه می شوند.

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

ویژگی های تراکنش :

 چهار ویژگی زیر توسط  WCF Transaction  پیروی می شوند :

Atomic   : همه چیز باید انجام شود یا انجام نشود.

 Consistency  : سیستم باید نامتناقض باقی بماند.

  Isolation  : اشتراک گذاری منابع مجاز نمی باشد . یا برای جهان خارج قابل مشاهده نباشد.

 Durable   : حالت باید بدون در نظر گرفتن هر شکست یا از دست دادنی حفظ شود.

 نحوه فعال کردن تراکنش در  WCF

قدم اول : قرارداد سرویس

    [ServiceContract]  
    public interface ITransaction  
    {  
        [OperationContract]  
        [TransactionFlow(TransactionFlowOption.Allowed)] //Step1  
        bool Dosomething();  
    }  

قدم دوم  :

    public class WCFTransaction: ITransaction  
    {  
        [OperationBehavior(TransactionScopeRequired = true)] //Step 2  
        public bool Dosomething()  
        {  
            using(SqlTransaction transaction = Program.dbConnection.BeginTransaction())  
            {  
                Boolean doRollback = false;  
                using(SqlCommand cmd = new SqlCommand("Query", objConnection))  
                try  
                {  
                    cmd.ExecuteNonQuery();  
                }  
                catch (SqlException)  
                {  
                    doRollback = true;  
                    break;  
                }  
            }  
            if (doRollback) transaction.Rollback();  
            else transaction.Commit();  
            return true;  
        }  
        return true;  
    }  
    }  

قدم سوم : تنظیمات  Web.Config

    <services>  
        <service name="Service">  
            <endpoint address="" binding="wsHttpBinding" contract="WCFTransactionAndIsolation.ITransaction" bindingConfiguration="TransactionBinding" /> </service>  
    </services>  
    <bindings>  
        <wsHttpBinding>  
            <binding name="TransactionBinding" transactionFlow="true"></binding>  
        </wsHttpBinding>  
    </bindings>  

نحوه فراخوانی سرویس ایجاد شده سمت سرویس گیرنده به صورت زیر می باشد :

    try  
    {  
        using(TransactionScope scope = new TransactionScope())  
        {  
            MyserviceClient client = new MyserviceClient();  
            client.upload();  
            client.upload();  
            scope.Complete();  
            MessageBox.Show("Cheers…");  
        }  
    }  
    catch  
    {  
        MessageBox.Show("My Error………………");  
    }  

سطح ایزوله سازی :

ایزوله سازی ضروری است ، بطور مثال دو عملیات داریم که قرار است بر روی یک جدول انجام شود. در یکی رکوردهای جدول بروز رسانی می شود و در همان زمان می خواهید عمل انتخاب یا هر عمل دیگری را بر روی رکودهای مشابه انجام دهید.

قدم اول: تعریف رفتار سرویس است.

    [ServiceBehavior(TransactionIsolationLevel = IsolationLevel.ReadCommitted)]  
    public class WCFTransaction: ITransaction  
    {  
        [OperationBehavior(TransactionScopeRequired = true)] //Step 2  
        public bool Dosomething()  
        {  
            using(TransactionScope scope = new TransactionScope())  
            {}  
            return true;  
        }  
    }  

قدم دوم استفاده از آن سمت سرویس گیرنده است.

    WcfTransaction.TransactionClient _objTransactionClient = new WcfTransaction.TransactionClient();  
    TransactionOptions _tsrnsOption = new TransactionOptions();  
    _tsrnsOption.IsolationLevel = IsolationLevel.ReadCommitted;  
    using(TransactionScope _objTransactionScope = new TransactionScope())  
    {  
        try  
        {  
            _objTransactionClient.Dosomething();  
            _objTransactionScope.Complete();  
        }  
        catch (Exception ex)  
        {}  
    }  

سطوح ایزوله سازی به شرح زیر می باشند :

Read Uncommited  : این سطح با نام  Dirty isolation یا سطح ایزوله کثیف نیز شناخته می شود . اطمینان می دهد که داده های خراب نمی توانند خوانده شوند . و پایین ترین سطح ایزوله است .

Read Commited : تضمین میکند ، داده هایی که توسط برنامه های دیگر تغییر کرده اند و هنوز متعهد نشده اند خوانده نمی شوند. که سطح پیش فرض در  WCF است.

Repeatable Read : خواندن داده های کثیف یا غیر قابل تکرار را متوقف میکند . این حالت ها Tداده واکشی شده را از طریق کوئری قفل کرده و اجازه بروزرسانی توسط تراکنش های دیگر را نمی دهد.  

Serializable  : تا زمانی که تراکنش کامل نشود اجازه تغییر داده ها و اضافه کردن داده جدید را نمی دهد. یک سطح پیشگیری محسوب می شود.

Snapshot  : خطا هنگام اصلاح داده ای که توسط تراکنش دیگری تغییر کرده است را بالا می برد.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • WCF
  • 3k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید