پنل اس ام اس
صفحه: [1]   پایین
  چاپ صفحه  
نويسنده موضوع: خصوصیت transactionدر کلاس sqlcommand  (دفعات بازدید: 1559 بار)
تقدسی
Super Manager
*

تشكرها : 100
آفلاین آفلاین

جنسيت : دختر
تعداد ارسال: 380

هیهات من الذله ...


ديدن مشخصات WWW
« : 18 مرداد 1389,ساعت 18:34:42 »

موضوع: خصوصیت transactionدر کلاس sqlcommand

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

کد:
UPDATE Accounts SET Balance = Balance □ 10 WHERE Customer = 1;
UPDATE Accounts SET Balance = Balance + 10 WHERE Customer = 2;


اگر قرار بود عبارت اول SQL، اجرا شود و عبارت دوم SQL اجرا نشود، آنگاه 10 دلار از حساب مشتری اول کم می شود، اما هرگز به حساب مشتری دوم واریز نمی شود. وقتی 10 دلار به طور کلی ناپدید شود، زیاد جالب نیست.

یک راه برای مقابله با این مشکل، کنترل وضعتت در database access codeتان است. می توان این کار را توسط گرفتن System.Data.SqlClient.SqlException هنگام انجام database access، انجام دهید. اما این موقعیت آنقدر که ابتدا به نظر می رسد آسان نیست. ممکن است عبارات SQL در جاهایی اجرا نشود:

قبل از اینکه اولین عبارت SQL اجرا شود.
بعد از اینکه اولین عبارت SQL اجرا شود.
بعد از اینکه دومین عبارت SQL اجرا شود.
این بدین معناست که شما باید ترازهای هر دو حساب را قبل از اتمام انتقال تعیین کنید، و مشخص کنید تراز کنونی کدام حساب با تراز ابتدایی یکی نیست.، و یک عبارت UPDATE اجرا کنید.

این شرایط توسط این واقعیت که SQL Server یک محیط دارای چندین کاربر است، بدتر هم می شود. در هر زمان، کاربرهای دیگر ممکن است به جدول حسابها دسترسی پیدا کنند و اگر به آن جدولی که بین اجرا نشدن عبارت شما و تصحیحات جدول وجود دارد دسترسی پیدا کنند، به خوبی می توانند به داده های نامعتبر دسترسی پیدا کنند. این بسیار بد خواهد بود، و ممکن است به مشکل شدن پیدا کردن bugها در کد شما منجر شود. (پیدا کردن bugهای مربوط به داده های همسان سازی (synchronization) در طول چندین فرایند بسیار مشکل است، زیرا آنها نام مخصوص خود را دارند: Heisenbugها )

نظریه database مدرن، پیشنهاد می کند که در یک دنیای transaction بی نقص، یک database دارای یک سری از خصوصیاتی (property) باشد که تحت عنوان ACID شناخته شوند. این خصوصیات عبارتند از:

Atomic: همه عبارات موجوددر یک گروه باید اجرا شوند، یا هیچ عبارتی نباید اجرا شود.

Consistent: به طور طبیعی از atomic تبعیت می کند؛ گروهی از عبارات SQL باید یک database را از یک حالت شناخته شده شروع تا یک حالت شناخته شده پایان بگیرند. اگر عبارات اجرا شوند، database باید در حالت شناخته شده پایانی باشد. اگر عبارت اجرا نشود، database باید در حالت شناخته شده شروع باشد.

Isolated: گروهی از عبارات باید مستقل از هر گروه عبارت دیگری که همزمان در حال اجرا شدن هستند، اجرا شوند. اگر اینگونه نباشد، ممکن نیست گروههای عبارت consistent (به هم پیوسته) باشند. ممکن است حالت شناخته شده پایانی توسط یک کد که شما هیچ کنترل یا اطلاعی از آن ندارید، تغییر کند. این، یکی از مفاهیمی است که در تئوری عالی است، اما Isolation کلی، تاثیرات اجرایی مهمی در دنیایی واقعی دارد. در مورد اینکه SQL Server چگونه این را اجرا می کند، بعداً بیشتر توضیح داده خواهد شد.

Durable: وقتی گروهی از عبارات SQL اجرا می شوند، نتایج باید در یک رسانه دایم ذخیره شود، که اگر database درست بعد از اینکه گروهی از عبارات SQL اجرا می شوند، از بین بروند، بازگرداندن حالت database به نقطه ای که بعد از اینکه آخرین transaction به حافظه سپرده میشود، ممکن باشد.

در SQL Server، ACID بودن، توسط مفهوم transactionها مهیا می شود. Transaction راهی برای گروه بندی عبارات SQL است، طوری که وقتی اجرا می شوند، transaction از اصول ACID تبعیت می کند. یک transaction با یک اتصال به database فعال می شود و به تمامی فرمانهای اجرا شده در آن اتصال اعمال می شود، تا وقتی که transaction تمام شود. زمانی که شما یک transaction دارید، دو کار می توانید با آن بکنید. یا می توانید transaction را بعد از اتمام به حافظه database بسپارید، یا می توانید transactionرا رها کنید و تغییرات بوجود آمده درآنرا به حالت اول برگردانید.

طبق Transact-SQL، سه فرمان مهم برای کنترل یک transaction وجود دارد. TRANSACTION BEGIN: یک transaction را شروع می کند،

COMMIT TRANSACTION: transaction را به حافظه database می سپارد.

ROLLBACK TRANSACTION: transaction را به حالت اول برمی گرداند.
 
شرح این متد بطور مفهومی:
 مثال زیر رو در نظر بگیرید :
از حساب a مقداری پول برداشته می شه و به حساب b ریخته می شه .. و در نهایت برای شما یک تاییده می یاد.
حالا فرض بگیرین که وقتی که پول از حساب a برداشته می شه مشکلی پیش می یاد یا برق می ره یا خلاصه عملیات دوم انجام نمی شه .. این وسط پول از حساب a برداشته شده .. در حالی که عملیات کامل انجام نشده
توسط این متد می تونید مطمئن بشین که وقتی عملیات کامل شد که تمامی زیر شاخه هاش کامل شده باشه .. و اگر حای یک مورد ناقص بود کل عملیات لغو بشه
برای اطلاعات بیشتر می تونید این لینک رو مشاهده کنید .

کد:
http://www.aspnet101.com/2010/07/working-with-ado-net-transactions
خارج شده است

كاربران گرامی : لطفاً قبل از هرگونه فعاليت ابتدا قوانين انجمن را مطالعه  و قبل از ارسال جديد در انجمن جستجو نماييد.
انجمن تخصصی استادان و دانشجویان کامپیوتر ایران
   

پنل اس ام اس
 خارج شده است
صفحه: [1]   بالا
  چاپ صفحه  
 
پرش به :