دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام
بستن تبلیغات
تسلط کامل بر سی‌شارپ با یک دوره پروژه‌محور

یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شی‌گرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفه‌ای و امکانات کامل!

مشاهده بیشتر
تسلط جامع بر MVC Core برای توسعه وب حرفه‌ای

یادگیری MVC Core از مبانی تا پیشرفته: شی‌گرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژه‌های کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!

مشاهده بیشتر

تراکنش در WCF

دوره های پیشنهادی

WCF –تراکنش (Transaction)

تراکنش در اصل به مجموعه ای از عملیات گفته می شود که باید یا همگی با موفقیت انجام شوند یا هیچ یک.

تراکنش (در WCF) عبارت است از یک مجموعه عملیات که همگی بایستی از چهار ویژگی عمومی به نام ACID پیروی کنند. در تراکنش حتی اگر یک عملیات با شکست مواجه شود، کل سیستم به صورت خودکار ناموفق خواهد بود. زمانی که کاربری به صورت آنلاین سفارشی را می دهد، در پی آن یک تراکنش اجرا می شود. در زیر با ذکر مثالی ساده سعی می کنیم این مفهوم را بهتر برای شما باز کنیم.

مثال:

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

طی اولین عملیات مبلغ مورد نظر از حساب شما کسر می شود و طی دومین عملیات به همان میزان اعتبار به حساب فروشنده تخصیص می یابد. برای اینکه تراکنش موفق باشد (تایید ثبت شود)، هر دو این عملیات باید با موفقیت تمام به اجرا برسند.

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

چهار ویژگی که هر تراکنشی در WCF می بایست از آن پیروی کند به شرح زیر می باشد:

1. Atomic (تجزیه ناپذیر): یک تراکنش می بایست یا کاملا اجرا شود و یا کلا لغو گردد. شکست هر یک از عملیات بر روی کل عملیات تراکنش تاثیر می‌گذارد و سبب عدم موفقیت عملیات تراکنش و بازگشتن اطلاعات به وضعیت پیشین (rollback) می شود.

1. Consistency (سازگاری) - یک تراکنش باید سیستم را از یک حالت نامتناقض و سازگار به حالت سازگار دیگری ببرد و جامعیت داده‌ها را باتوجه به قوانین آن حفظ کند. مجموعه عملیات هر چه می خواهد باشد، هیچ گونه تناقضی نباید در سیستم یافت شود و خروجی تراکنش بایستی با نتیجه ی مورد انتظار منطبق باشد.

3. Isolation (انزوا و استقلال تراکنش ها از هم) - هر تراکنش باید از سایر تراکنش‌هایی که ممکن است همزمان در همان محیط در حال اجرا باشند مجزا باشد. حالت میانی سیستم می بایست از موجودیت های خارجی تا زمان اتمام تراکنش پنهان بماند.

4. Durability (ماندگاری) - تاثیرات اجرای موفق یک تراکنش باید ماندگار باشند. بدین معنی که وضعیت پس از تایید ثبت، می بایست حتی در صورت بروز خرابی سخت افزاری، قطعی برق و غیره ... ماندگار باقی بماند و حفظ شود.

به هنگام تنظیم یک تراکنش چند عامل وجود دارد که باید به آن توجه کنید. این عوامل، رفتارهای Binding و operation هستند.

Binding –binding هایی که در WCF از transaction پشتیبانی می کنند محدود هستند. برای اجرای تراکنش لازم است یکی از این binding ها را انتخاب نمایید که به صورت پیش فرض غیرفعال بوده و به منظور دریافت پشتیبانی لازم می بایست فعال سازی شوند. Binding های نام برده به شرح زیر می باشند:

NetTcpBinding

NetNamedPipeBinding

WSHttpBinding

WSDualHttpBinding

WSFederationHttpBinding

Operation behavior –در حالی که binding مسیر یا زمینه ی انتشار (propagation) تراکنش را فراهم می کند، Operation وظیفه ی پردازش تراکنش و تنظیمات عملیات (operation config) را بر عهده دارد. Operation behavior عمدتا از دو attribute استفاده می کند: خصیصه ی TransactionFlow و TransactionScopeRequired. خصیصه ی TransactionFlow را می توان با سه مقدار Allowed، Mandatory، NotAllowed تنظیم کرد.

کد زیر مشخص می کند آیا تنظیم binding و operation contract انتشار (propegation) یک کلاینت را آسان می سازد یا خیر:

 

   

      

        

     

   


پروتکل های مجاز برای اجرای تراکنش (Transaction Protocol)

WCF برای تراکنش از سه پروتکل زیر استفاده می کند:

Transaction Protocol WCF uses three types of protocols for transaction:

Lightweight Ole Transaction WS-Atomic Transaction (WS-AT)

از این سه، WS-AT پروتکلی است که از قابلیت همکاری (interoperability) پشتیببانی می کند و این امکان را فراهم می آورد تا تراکنش ها بین اپلیکیشن های دیگر منتشر شود (آن ها را از مرز فرایند، App Domain و کامپیوتر ها فراتر می برد). در واقع WS-AtomicTransaction (WS-AT) یک پروتکل برای مدیریت تراکنش های تجزیه ناپذیر بین اپلیکیشن های توزیع شده، transaction manager ها و resource manager ها است. چنانچه قرار است تراکنش منحصرا بر پایه ی تکنولوژی مایکروسافت (WCF) باشد، در آن صورت استفاده از این پروتکل توصیه نمی شود.

مراحل تراکنش در WCF (transaction phase)

تراکنش ها در WCF دو مرحله (phase) را پشت سر می گذارند که این دو مرحله در زیر به تصویر کشیده شده اند:

آموزش WCF

· Prepare phase (مرحله ی بررسی آمادگی) –در این مرحله transaction manager بررسی می کند آیا تمامی موجودیت ها آمادگی تایید ثبت شدن (commit) را دارند یا خیر.

· Commit phase (مرحله ی تایید ثبت) –در این مرحله، تمامی موجودیت ها به طور کامل تایید ثبت می شوند.

تصویر زیر اتفاقاتی که در هر مرحله ی تراکنش رخ می دهد را دقیق نمایش می دهد.

آموزش WCF

فعال سازی تراکنش WCF

برای فعال سازی یک تراکنش WCF لازم است شش مرحله ی زیر را به ترتیب دنبال نمایید:

گام اول - ایجاد دو سرویس WCF : ابتدا می بایست دو پروژه ی سرویس WCF (برای شرکت در یک تراکنش واحد) ایجاد نمایید. در این مرحله تراکنش های پایگاه داده بر روی هر دو سرویس اجرا شده و به دنبال آن مشخص می شود که چگونه هر دو توسط یک تراکنش WCF به صورت یکپارچه تایید ثبت می شوند. برای این منظور یک اپلیکیشن تحت وب به نام WCFTransactions ایجاد می شود که هر دو سرویس را در قالب یک تراکنش واحد (transaction scope) صدا زده و مورد استفاده قرار می دهد.

آموزش WCF

گام دوم –ایجاد متد و استفاده از خصیصه ی (attribute) TransactionFlow: در این مرحله یک متد UpdateData ویژه ی هر دو سرویس برای انجام عملیات درج در پایگاه داده به وسیله ی خصیصه ی (attribute) OperationContract نوشته می شود. برای این منظور، ابتدا بایستی با استفاده از خصیصه ی ServiceContract یک کلاس interface ایجاد نمود. حال جهت فعال سازی تراکنش در متد نام برده، لازم است خصیصه ی TransactionFlow را بکار برده و برای پشتیبانی از تراکنش آن را با Allowed مقداردهی کرد.

 [ServiceContract]

public interface IService1

{

  [OperationContract]

  [TransactionFlow(TransactionFlowOption.Allowed)]

  void UpdateData();

}

گام سوم –پیاده سازی سرویس WCF با خصیصه ی TransactionScopeRequired:


 [OperationBehavior(TransactionScopeRequired = true)]

public void UpdateData()

{

  try

  {

     SqlConnection objConnection = new SqlConnection(strConnection);

     objConnection.Open();

     using(SqlTransaction transaction = Program.dbConnection.BeginTransaction())

     {

                    Boolean doRollback = false;

                    using(SqlCommand cmd = new SqlCommand("insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))

                    try

                    {

           cmd.ExecuteNonQuery();

                    }

        catch(SqlException)

                    {

           doRollback = true;

           break;

                    }

     }

     if(doRollback)

        transaction.Rollback();

     else

        transaction.Commit(); 

  }

  finally

  {

     objConection.Close();

  }

}

گام چهارم –فعال سازی Transaction Flow از طریق فایل تنظیمات (Config):



  

     

  


برای قرار دادن سرویس در اختیار کلاینت (expose کردن سرویس)، لازم است binding مجاز برای تراکنش را به آدرس endpoint اضافه نمایید.

گام پنجم –فراخوانی هر دو سرویس با یک تراکنش واحد: در این مرحله سرویس های نام برده در قالب یک تراکنش واحد فراخوانی می شوند. برای این منظور لازم است با استفاده از شی TransactionScope دو سرویس گروه بندی شده، سپس برای تایید ثبت تراکنش (commit) متد کامل شی مذکور صدا زده شود. برای بازگردانی تراکنش به حال قبلی (rollback)، کافی است متد Dispose فراخوانده شود.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))

{

  try

  {

     // Call your webservice transactions here

     ts.Complete();

  }

  catch (Exception ex)

  {

     ts.Dispose();

  }

}

تکه کد زیر دو تراکنش ذکر شده ی WCF را نشان می دهد که در یک محدوده ی (scope) واحد گروه بندی شده اند (و به صورت یکپارچه اجرا می شوند):

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))

{

  try

  {

     ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();

     obj.UpdateData();

     ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();

     obj1.UpdateData();

     ts.Complete();

  }

  catch (Exception ex)

  {

     ts.Dispose();

  }

}

گام ششم –تست تراکنش: تست در مرحله ی آخر و پس از فراخوانی اولین سرویس WCF انجام می شود. همان طور که در تصویر زیر مشاهده می کنید در پی فراخوانی سرویس اول خطا پرتاب (throw) می شود:

آموزش WCF
1395/05/12 2099 4
نظرات شما

نظرات خود را ثبت کنید...