اکتیویتی TransactionScope
آموزش WCF -اکتيويتي TransactionScope
در اين قسمت از آموزش، يک سيستم گردش کار با استفاده از اکتيويتي TransactionScope طراحي خواهيم کرد. در اين پروژه همچنين از يک اکتيويتي سفارشي براي درج اطلاعات در پايگاه داده استفاده خواهيم کرد.
زماني که از اکتيويتي TransactionScope استفاده مي کنيد اگر در هر کجا از Body آن خطايي رخ دهد، تمام اطلاعات RollBack خواهد شد و به حالت اوليه باز مي گردد. بعنوان مثال اگر خطا بعد از درج کردن داده ها رخ دهد، عمليات درج RollBack خواهد شد.
مراحل انجام کار
پروژه گردش کار UseTransactionScope شامل مراحل زير است:
- ايجاد يک پروژه از نوع Workflow Console Application
- ايجاد پايگاه داده TransactionDB
- ايجاد فايل InsertDataToDBActivity
- ايجاد و طراحي Workflow
- اجراي Workflow
- اضافه کردن اکتيويتي 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 را باز کنيد و کارهاي زير را انجام دهيد:
- از پنل Toolbox، اکتيويتي Sequence را بداخل صفحه بکشيد و Workflow را مطابق شکل زير طراحي نماييد:
- ...
اجراي 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 قرار دهد و اجازه نمی دهد که دیگر کاربران، جدول مذکور را ویرایش کنند.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 7471