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

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

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

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

Transaction یا تراکنش :

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

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

 چهار ویژگی زیر توسط  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  : خطا هنگام اصلاح داده ای که توسط تراکنش دیگری تغییر کرده است را بالا می برد.

دانلود نسخه ی PDF این مطلب