سبد (0)

اکتیویتی TransactionScope

آموزش WCF -اکتيويتي TransactionScope

در اين قسمت از آموزش، يک سيستم گردش کار با استفاده از اکتيويتي TransactionScope طراحي خواهيم کرد. در اين پروژه همچنين از  يک اکتيويتي سفارشي براي درج اطلاعات در پايگاه داده استفاده خواهيم کرد.

زماني که از اکتيويتي TransactionScope استفاده مي کنيد اگر در هر کجا از Body آن خطايي رخ دهد، تمام اطلاعات RollBack خواهد شد و به حالت اوليه باز مي گردد. بعنوان مثال اگر خطا بعد از درج کردن داده ها رخ دهد، عمليات درج RollBack خواهد شد.

مراحل انجام کار

 پروژه گردش کار UseTransactionScope شامل مراحل زير است:

  1. ايجاد يک پروژه از نوع Workflow Console Application
  2. ايجاد پايگاه داده TransactionDB
  3. ايجاد فايل InsertDataToDBActivity
  4. ايجاد و طراحي Workflow
  5. اجراي Workflow
  6. اضافه کردن اکتيويتي Throw

ايجاد يک پروژه از نوع Workflow Console Application

در پنل Solution Explorer روي Solution Chapter03 راست کليک کرده و از گزينه ADD زير منوي New Project را انتخاب نماييد. سپس در پنجره Add New Project گزينه workflow را انتخاب کرده و سپس از سمت راست پنجره گزينه Workflow Console Application را انتخاب نماييد. حالا قسمت Name را با مقدار UseTransactionScope تنظيم نماييد و نهايتاً روي دکمه OK کليک کنيد.  


ايجاد پايگاه داده TransactionDB

 در SQL Server يک پايگاه داده با نام TransactionDB ايجاد کنيد و از کوئري زير براي ايجاد جدول UserTable استفاده کنيد:

TransactionDB 

create table UserTable(
	UserID nvarchar(50) primary key
)

ايجاد فايل InsertDataToDBActivity

در پنل Solution Explorer روي پروژه UseTransactionScope راست کليک کرده و گزينه Add -> New Item را انتخاب نماييد.

در پنجره Add New Item، نام فايل را "InsertDataToDBActivity.cs" قرار داده و روي دکمه Add کليک نماييد.

حالا فايل InsertDataToDBActivity.cs را باز نماييد و کدهاي زير را در آن پيست کنيد، سپس آنرا Save و پروژه را Build نماييد:

InsertDataToDBActivity

using System;
using System.Activities;
using System.Data.SqlClient;
namespace UseTransactionScope
{
    public class InsertDataToDBActivity : NativeActivity
    {
        public InArgument UserID { get; set; }
        protected override void Execute(NativeActivityContext
        context)
        {
            SqlConnection con = new System.Data.SqlClient.SqlConnection();
            con.ConnectionString = "Data Source=192.16.55.12;Initial Catalog=TransactionDB;User ID=sa;Password=123456";
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = string.Format("insert into UserTable (UserID) values ('{0}')", UserID.Get(context));
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
}

توجه: در کد بالا، قسمت ConnectionString بايد توسط شما مجدد تنظيم شود. (Data Source و User ID و Password)


ايجاد و طراحي Workflow

فايل Workflow1.xaml را باز کنيد و کارهاي زير را انجام دهيد:

  1. از پنل Toolbox، اکتيويتي Sequence را بداخل صفحه بکشيد و Workflow را مطابق شکل زير طراحي نماييد:
  2. ...


اجراي Workflow

پروژه UseTransactionScope را بعنوان پروژه StartUp تنظيم نماييد و در ادامه براي اجراي Workflow دکمه هاي ميانبر Ctrl+F5 را فشار دهيد. چاپ شدن "End Trancaction" نشان مي دهد که رکورد مورد نظر در جدول درج شده است:

همان طور که در شکل زير مي بينيد، يک رکورد به جدول UserTable اضافه شده است:

اما در ادامه قصد داريم، در قسمت Body اکتيويتي TransactionScope يک خطا ايجاد کنيم، البته براي اينکه کارايي اين اکتيويتي را بصورت کامل متوجه شويد، ايجاد خطا را بعد از درج شدن داده ها ايجاد خواهيم کرد.


اضافه کردن اکتيويتي Throw

فايل Workflow1.xaml را باز کنيد و از پنل Toolbox، اکتيويتي Throw را بعد از InsertDataToDBActivity قرار دهيد:

حالا پروژه را اجرا کنيد، همان طور که در شکل زير مي بينيد، اکتيويتي Throw عمل کرده و خطاي زير گزارش داده مي شود:

حالا به سراغ پايگاه داده مي رويم، خواهيد ديد که رکوردي درج نشده است.

توجه: همان طور که در شکل زیر مشاهده می کنید، خصوصیت IsolationLevel مربوط به اکتیویتی TransactionScope بصورت پیشفرض با مقدار Serializable تنظیم شده است. با تنظیم این مقدار، تمام Dataهایی که در Transaction استفاده می شوند توسط پایگاه داده قفل می شوند و تا پایان کار Transaction این قفل باقی می ماند. در واقع پایگاه داده روی جدول مورد نظر یک Lock قرار دهد و اجازه نمی دهد که دیگر کاربران، جدول مذکور را ویرایش کنند.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه