جلوگیری از ورود اطلاعات نا معتبر در Database از طریق Sql Transaction
نمایش نتایج: از شماره 1 تا 6 , از مجموع 6

موضوع: جلوگیری از ورود اطلاعات نا معتبر در Database از طریق Sql Transaction

  1. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض جلوگیری از ورود اطلاعات نا معتبر در Database از طریق Sql Transaction

    مقدمه :
    با توجه به اینکه امروزه ( به دلیل حجم گسترده ی اطلاعات )، Database یکی از ارکان اصلی هر نرم افزار است، رفته رفته نیاز به مدیریت اطلاعات درون آن، بیشتر از پیش احساس می شود. یکی از جنبه های این مدیریت، جلوگیری از ورود اطلاعات نامعتبر به Database است، که امروزه حتی در نرم افزار های کاربردی و خانگی مورد نیاز است. فرض کنید در حال تولید نرم افزاری هستید ( Windows Application ، Web Application و یا Network Application ) که در آن هنگام ایجاد Profile برای کاربر جدید، علاوه بر ورود مشخصات او به یک جدول عمومی ( مثل tblUser ) ، یک جدول اطلاعات مجزا برای او تشکیل می دهید. اگر برنامه در هنگام ارتباط با Database دچار مشکل شود، و یا به هر دلیلی ارتباط قطع گردد، این عمل انجام نخواهد شد. با این همه در صورتی که در همان ابتدای امر مشکل ایجاد شود، می توانید با یک پیغام از کاربر بخواهید که دوباره عمل ثبت نام را انجام دهد. ولی مشکل اصلی زمانی است که در میان عمل ثبت نام، برنامه با مشکل روبرو شود، در این صورت مثلا مشخصات کاربر به جدول tblUser وارد می شود، ولی جدول مجزای کاربر ایجاد نمی شود. در این حالت برنامه ی شما (هر چقدر هم که منظم و بدون عیب ایجاد شده باشد ) دچار مشکل خواهد شد. مشکلی که از نظر کاربر از برنامه نویسی شما ناشی می شود. البته تا حدودی هم حق با اوست، چون کاربر نه می تواند دوباره اطلاعاتش را وارد کند، و نه می تواند با Profile که برای او به صورت ناقص ساخته شده است، با نرم افزار کار کند. در این صورت است که نرم افزار تولید شده توسط شما، دارای برچسب عدم اطمینان خواهد شد. این تنها یک مثال بود، در صورتی که این اتفاق ممکن است برای هر نرم افزاری که با پایگاه داده سرو کار دارد، رخ دهد. برای جلوگیری از بروز این گونه اشکالات، در زبان T-SQL که زبان مورد استفاده در MS SQL هم هست، دستور Transaction گنجانده شده است. این دستور پیچیدگی هایی برای یک برنامه نویس به همراه دارد، و از آنجا که هدف NET Framework. ایجاد پلتفرمی ساده تر از پیش برای برنامه نویسان بود، در NET. سه راه حل کلی برای اینکار ارائه شده است. پیاده سازی هر کدام از این روش ها با ۳ تا ۵ خط کد انجام می شود. به همین خاطر توصیه شده است، برای تمامی دستوراتی که اطلاعات Database را تغییر می دهند ( از جمله Insert ، Update ، Delete و حتی Create Table و Drop Table )، از Sql Transaction استفاده شود، اعم از اینکه احتمال بروز خطا بالا است یا کمتر از % 0.1 است. فراموش نکنید که یکی از دلایل موفقیت یک نرم افزار، بدون عیب بودن ( در دنیای واقعیت: داشتن حداقل تعداد عیب ) آن است.
    نکاتی که قبل از شروع مقاله باید به آنها دقت کنید :
    برای بهره برداری کامل از این مقاله، نیاز به مهارت های زیر دارید:
    · داشتن علم مقدماتی SQL Server · آشنایی ابتدایی به یکی از زبان های NET. (البته برنامه های این مقاله به زبان VB.NET نوشته شده است، ولی با توجه به اینکه فهم توابع و متدهای به کار برده شده، برای درک کامل کد و ترجمه آن به هر زبان دیگری از جمله #C و J# کافی می باشد، برای درک کامل این مقاله، آشنایی مقدماتی به هرکدام از زبان های NET. برای شما کافی است.)
    نکته:هر کدام از روش های ارائه شده، (در بیش از 95% مواقع) به تنهایی جوابگوی این مسئله خواهند بود. با این همه ابتدا هر سه روش را مطالعه کرده، و سپس با توجه به ویژگی های هر کدام، روش مورد استفاده ی خود را انتخاب کنید.
    پیاده سازی و استفاده از Sql Transaction :
    سه روش معمول برای پیاده سازی Sql Transaction وجود دارد:
    ۱ - استفاده از کلاس TransactionScope ( ساده ترین روش )
    ۲- استفاده از کلاس CommittableTransaction ( پر کاربرد ترین روش )
    ۳ - استفاده از کلاس SqlTransaction ( پر امکانات ترین روش )

    روش اول – مدیریت اطلاعات را به NET Framework. واگذار کنید :
    کلاس: TransactionScope
    مشخصه ی بارز: ساده ترین روش
    در این روش همان طور که از نام کلاس آن مشخص است، شما یک محدوده ی Transaction مشخص می کنید و سایر کارها توسط خود NET. انجام می شود.
    کلاس TransactionScope در فضای نامی System.Transactions قرار دارد، به طور پیش فرض ارجاعی به فایل system.transactions.dll وجود ندارد، پس شما باید ابتدا یک ارجاع به فایل system.transactions.dll ایجاد کنید، تا بتوانید فضای نامی System.Transactions را به برنامه Imports کنید. (نحوه ی افزودن ارجاع به فایل، در پایان مقاله توضح داده شده است.)

    Imports System.Transactions
    اکنون باید یک شی از کلاس TransactionScope ایجاد کنید:
    Dim sqlTransaction1 As New TransactionScope
    از همان لحظه ای که یک شی ( توسط کلمه ی کلیدی New ) از کلاس TransactionScope ایجاد می گردد، محدوده ی Transaction شروع می شود. حال باید اتمام محدوده را هم مشخص کنید، برای اینکار از متد Complete از شی استفاده کنید:
    sqlTransaction1.Complete()

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #1 ارسال شده در تاريخ 11th December 2011 در ساعت 09:58

  2. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    اتمام محدوده معمولا به عنوان آخرین دستور ( قبل از آزاد سازی حافظه ) در تابع یا سابروتین نوشته می شود. البته می دانیم که در .NET خود Garbage Collection، آزاد سازی حافظه را انجام می دهد، ولی توصیه می شود، برای نگهداری کد در محدوده ی مهندسی نرم افزار، آزاد سازی های اشیاء ایجاد شده به صورت دستی انجام شود. حتی به غیر از این مسئله، آزادسازی شی TransactionScope در کاربرد های تخصصی تر یک امر الزامی است، وگرنه کار مذکور به صورت ناقص انجام خواهد شد. با این تفاسیر، توصیه می شود همیشه آزاد سازی را به صورت دستی ( با فراخوانی متد Dispose ) انجام دهید. مثال: کد زیر سابروتینی را نشان می دهد، که یک رکورد به جدول اضافه می کند. در این سابروتین از کلاس TransactionScope برای عمل Transaction استفاده شده است:
    در این سابروتین، برنامه ابتدا یک شی TransactionScope ایجاد می کند، سپس عملیات درج در جدول را انجام می دهد، و در پایان متد Complete شی را فراخوانی می کند. در صورتی که خطایی رخ ندهد، اجرای سابروتین پس از درج، با موفقیت به پایان می رسد، در غیر این صورت اگر در ساختار Try... Catch... End Try ( تنها جایی که امکان بروز خطا وجود دارد ) خطایی رخ دهد، اجرای برنامه، قبل از فراخوانی متد Complete از شی TransactionScope ، به داخل Catch منتقل می شود و در نتیجه متد Complete فراخوانی نشده و تمامی تغییرات Database ( از آغاز محدوده ی TransactionScope تا اینجا ) ، به صورت خودکار نادیده گرفته می شود و Database به حالتی که قبل از اجرای سابروتین AddToTable داشته، باز می گردد.
    روش دوم – بدون پیچیدگی، عمل مدیریت اطلاعات را شخصا" انجام دهید :
    کلاس: CommittableTransaction
    مشخصه ی بارز: پر کاربرد ترین روش
    کلاس CommittableTransaction در فضای نامی System.Transactions قرار دارد، به طور پیش فرض ارجاعی به فایل system.transactions.dll وجود ندارد، پس شما باید ابتدا یک ارجاع به فایل system.transactions.dll ایجاد کنید، تا بتوانید فضای نامی System.Transactions را به برنامه Imports کنید. (نحوه ی افزودن ارجاع به فایل، در پایان مقاله توضح داده شده است.)
    نکته:در صورتی که روش قبل را در پروژه ای پیاده سازی کرده اید، نیازی به افزودن دوباره ی ارجاع برای همان پروژه نیست.
    Imports System.Transactions
    اکنون باید یک شی از کلاس CommittableTransaction ایجاد کنید:

    Dim sqlTransaction1 As New CommittableTransaction
    همچنین باید بعد از باز کردن مسیر ارتباط با Database ( دستور ()sqlConnection1.Open ) ، شی CommittableTransaction را به عنوان پارامتر به متد EnlistTransaction از شی sqlConnection1 ارسال کنید، تا Transaction بر روی این ارتباط، از همین لحظه آغاز شود.

    sqlConnection1.EnlistTransaction(sqlTransaction1)
    در این روش باید عملیات ادامه ی کار و بازگشت به قبل از خطا را به صورت دستی پیاده سازی کنید. در صورتی که خطایی رخ دهد، لازم است متد Rollback از شی را فراخوانی کنید:

    sqlTransaction1.Rollback()
    و در صورت اجرای موفقیت آمیز دستورات، لازم است متد Commit از شی را ( برای اعمال تغییرات در Database ) فراخوانی کنید:

    sqlTransaction1.Commit()
    جایگذاری این دستورات توسط شما و طبق صلاحدید شما انجام می پذیرد، ولی به عنوان یک استاندارد تعریف نشده، فراخوانی متد Commit بلافاصله قبل از بستن ارتباط، و فراخوانی متد Rollback در قسمت Catch شده، قرار می گیرد. نکته:توجه داشته باشید که نمی توانید قبل از ارسال شی به ارتباط باز شده، عمل Commit و یا Rollback را انجام دهید، ولی قرار دادن آنها پس از بستن ارتباط، مشکلی ایجاد نمی کند.

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #2 ارسال شده در تاريخ 11th December 2011 در ساعت 09:59

  3. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    مثال: کد زیر سابروتینی را نشان می دهد، که یک رکورد به جدول اضافه می کند. در این سابروتین از کلاس CommittableTransaction برای عمل Transaction استفاده شده است:
    در این سابروتین، برنامه ابتدا یک شی CommittableTransaction ایجاد می کند، و بعد از باز کردن ارتباط، شی CommittableTransaction را به عنوان Transaction کمکی به شی sqlConnection1 ارسال می کند. سپس عملیات درج در جدول را انجام می دهد. در پایان در صورتی که خطایی رخ ندهد، متد Commit فراخوانی شده و تغییرات در Database ثبت می شوند و اجرای برنامه پس از درج، با موفقیت به پایان می رسد. در غیر این صورت، اگر در ساختار Try... Catch... End Try خطایی رخ دهد، اجرای برنامه، قبل از فراخوانی متد Commit از شی CommittableTransaction ، به داخل Catch منتقل می شود و در نتیجه متد Commit فراخوانی نشده و در عوض متد Rollback فراخوانی می شود. این متد ( برخلاف روش اول )، صراحتا تمامی تغییرات Database ( از ارسال شی CommittableTransaction به ارتباط، تا اینجا ) نادیده گرفته می شود و Database به حالتی که قبل از اجرای سابروتین AddToTable داشته، باز می گردد. نکته: در صورتی که تنها با Database های کوچک و متوسط سرو کار دارید، و یا تجربه ی زیادی در کار با پایگاه داده ندارید و یا حتی از کد های پیچیده خوشتان نمی آید، روش سوم را فاکتور بگیرید، و از خواندن آن صرف نظر کنید، چون به دلیل پیچیدگی بیشتر نسبت به دو روش قبل، باعث گیج شدن شما خواهد شد. توصیه می کنم در صورتی که این شرایط برای شما صدق می کند، به انتهای مقاله (در بخش دوم ) بروید و با توضیحی که در آنجا آمده است، یکی از دو روش اول را جهت استفاده، انتخاب کنید.
    برای افزودن یک ارجاع به فایل system.transactions.dll مراحل زیر را انجام دهید:
    از منوی Project آخرین گزینه را انتخاب کنید، تا صفحه ی Project Properties باز شود. در تب References بر روی دکمه ی ...Add کلیک کنید، تا صفحه ی Add References باز شود. در این صفحه در تب اول ( NET. )، به دنبال System.Transactions بگردید، آن را انتخاب کنید و بر روی دکمه ی OK کلیک کنید. در این لحظه یک ارجاع به فایل system.transactions.dll ایجاد می شود. پروژه را توسط گزینه ی SaveAll از منوی File ذخیره کرده و صفحه ی Project Properties را ببندید.
    سخن پایانی :
    · از اینکه تا اینجا با من همراه بودید، کمال تشکر را دارم.
    · با توجه به حجم گستره، این مطلب در دو مقاله قرار گرفت که روش های اول و دوم در این بخش ارائه شدند، و روش سوم ( که پیچیده ترین و تخصصی ترین روش است ) در بخش بعدی ارائه می شود. در بخش بعدی همینطور مقایسه بین این سه روش انجام می گیرد و اینکه کدام را به عنوان روش شخصی انتخاب کنیم. البته برای استفاده ، اطلاعاتی که تا این لحظه کسب کرده اید، کافی است و می توانید برنامه تان را با قابلیت Transaction بنویسید، با این همه در مقاله ی بعد، راه دیگری هم توضیح داده می شود.
    · بحث در مورد Sql Transaction به این سه روش ختم نمی شود، بلکه هم روش های دیگری وجود دارند و هم هر روش جزئیات وسیعی را شامل می شود. با این همه به ارائه ی این سه روش اکتفا می کنم، بقیه ی مطالب را ( در صورتی که به آن احساس علاقه می کنید ) می توانید در MSDN دنبال کنید، هر چند در صورت ایجاد هر گونه ابهام و یا سوالی در مورد سایر روش ها، بنده در حد توان در خدمت دوستان هستم.
    · دلیل تهیه ی این مقاله در اوج امتحانات، فقط و فقط استقبال گسترده ی شما از مقاله ی پیشین بود و نه چیز دیگر. به همین دلیل با نظرات و انتقادهایتان ادامه ی این مقاله و مقالات مشابه را تضمین می کنید. در صورتی که از مباحثی که من ارائه می دهم و یا نگارشم، به هر دلیلی خوشتان نمی آید و ترجیح می دهید دیگر از من مقاله ای نبینید، یک راه ساده وجود دارد، و آن هم عدم ارائه ی نظرات ، پیشنهادات و یا حتی سولاتتان است. امیدوارم مرا از نظرات ، پیشنهادات و انتقادات خود مطلع کنید.
    فایل Solution این پروژه در بخش بعدی، در اختیارتان قرار خواهد گرفت.

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #3 ارسال شده در تاريخ 11th December 2011 در ساعت 09:59

  4. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

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

    روش سوم – عمل مدیریت اطلاعات را با امکانات بیشتر و البته پیچیدگی بیشتری انجام دهید :
    کلاس: SqlTransaction
    مشخصه ی بارز: پر امکانات ترین روش
    پیاده سازی کلی این روش (بدون امکانات ) تا حد زیادی مشابه پیاده سازی روش دوم است.
    کلاس SqlTransaction در فضای نامی System.Data.SqlClient قرار دارد، و با توجه به اینکه در هر برنامه ی پایگاه داده، این کلاس قبلا Imports ( یا در C# ، Using) شده است، شما نیاز به افزودن هیچ فضای نامی به برنامه نخواهید داشت.
    برای پیاده سازی این روش، ابتدا نیاز به یک شی از این کلاس دارید:


    Dim sqlTransaction1 As SqlTransaction
    نکته:دقت داشته باشید که کلاس SqlTransaction دارای سازنده نیست، پس نباید از کلمه ی کلیدی New در تعریف شی استفاده کنید.
    همچنین باید بلافاصله بعد از باز کردن ارتباط، متد BeginTransaction از شی sqlConnection1 را به شی SqlTransaction انتساب دهید:

    sqlTransaction1 = sqlConnection1.BeginTransaction()
    سپس باید شی SqlTransaction را به خصیصه ی Transaction از شی sqlConnection1 انتساب دهید:

    sqlCommand1.Transaction = sqlTransaction1
    از اینجای کار، دقیقا مشابه روش دوم است: در این روش باید عملیات ادامه ی کار و بازگشت به قبل از خطا را به صورت دستی پیاده سازی کنید. در صورتی که خطایی رخ دهد، لازم است متد Rollback از شی را فراخوانی کنید:

    sqlTransaction1.Rollback()
    و در صورت اجرای موفقیت آمیز دستورات، لازم است متد Commit از شی را ( برای اعمال تغییرات در Database ) فراخوانی کنید:
    sqlTransaction1.Commit()
    همان طور که قبلا هم گفته شد، جایگذاری این دستورات توسط شما و طبق صلاحدید شما انجام می پذیرد، ولی به عنوان یک استاندارد، فراخوانی متد Commit بلافاصله قبل از بستن ارتباط، و فراخوانی متد Rollback در قسمت Catch شده ( در ساختار Try دوم ) قرار می گیرد.
    نکته:توجه داشته باشید که نمی توانید قبل از ارسال شی به sqlCommand1 ، عمل Commit و یا Rollback را انجام دهید، ولی قرار دادن آنها پس از بستن ارتباط، مشکلی ایجاد نمی کند.
    مثال: کد زیر سابروتینی را نشان می دهد، که یک رکورد به جدول اضافه می کند. در این سابروتین از کلاس SqlTransaction برای عمل Transaction استفاده شده است:

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #4 ارسال شده در تاريخ 11th December 2011 در ساعت 09:59

  5. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    نکته:در اینجا ناگزیرید از دو ساختار Try... Catch... End Try تو در تو استفاده کنید، به این دلیل که شی SqlTransaction به دو انتساب نیاز دارد، و در صورتی که در ساختار Try اول، این انتسابها را انجام دهید، نمی توانید در Catch همان ساختار، دستور sqlTransaction1.Rollback() را بنویسید، چون طول عمر انتساب ها قبل از Catch به اتمام می رسد.
    در این سابروتین، برنامه ابتدا یک ارجاع به شی SqlTransaction ایجاد می کند، و بعد از باز کردن ارتباط، شروع Transaction در شی sqlConnection1 را به شی SqlTransaction انتساب داده و همین طور شی SqlTransaction را به متد Transaction از شی sqlCommand1 انتساب می دهد. سپس عملیات درج در جدول را انجام می دهد، در پایان در صورتی که خطایی رخ ندهد، متد Commit فراخوانی شده و تغییرات در Database ثبت می شوند و اجرای برنامه پس از درج، با موفقیت به پایان می رسد. در غیر این صورت، اگر در ساختار Try... Catch... End Try دوم خطایی رخ دهد، اجرای برنامه، قبل از فراخوانی متد Commit از شی SqlTransaction ، به داخل Catch منتقل می شود و در نتیجه متد Commit فراخوانی نشده و در عوض متد Rollback فراخوانی می شود. این متد ( برخلاف روش اول )، صراحتا تمامی تغییرات Database ( از ارسال شی SqlTransaction به ارتباط، تا اینجا ) نادیده گرفته می شود و Database به حالتی که قبل از اجرای سابروتین AddToTable داشته، باز می گردد.
    یک سوال: در اینجا یک سوال پیش می آید و آن اینکه چرا این کلاس ایجاد شده، در صورتی که همین اعمال با روش دوم قابل انجام هستند، آنهم با دستورات و پیچیدگی به مراتب کمتر ؟
    پاسخ: درست است که مثال روش سوم بدون اشکال اجرا شده و کاری همانند روش دوم انجام می دهد، ولی در حقیقت این کلاس برای این منظور طراحی نشده است. بلکه این کلاس توانایی دارد، که دو روش قبل در آن احساس عجز می کنند، و آن هم ساختن یک یا چند نقطه ی بازگشت و حرکت بین آنهاست.
    برای اینکه بهتر متوجه منظورم بشوید، به سرویس Restore Point در Windows XP ( و بالاتر ) نگاهی بیاندازید. رابط کاربری این سرویس را می توانید به صورت زیر مشاهده کنید: در پنجره ی Run ویندوز، عبارت restore را تایپ کرده و بر روی دکمه ی OK کلیک کنید. در صفحه ی باز شده، فایل restrui.exe را اجراکنید. در این لحظه، صفحه ی خوش آمدگویی System Restore ظاهر می شود. در سمت راست این صفحه دو گزینه وجود دارد. یکی Create Restore Point که توسط آن می توانید یک نقطه ی بازگشت به صورت دستی برای ویندوز ایجاد کنید، و دیگری Restore My Computer To An Earlier Time که تنظیمات و فایل های اصلی ویندوز را (تا حدی که برایش ظرفیت وجود دارد ) به یک زمان زوتر بر می گرداند.
    علاوه بر اینکه شما می توانید یک نقطه ی بازگشت بسازید، خود ویندوز در موقعیت های خاصی (مانند نصب نرم افزار ) به صورت خودکار نقاط بازگشتی ایجاد می کند. در صورت بروز مشکل در قسمتی از ویندوز ( و حتی بعضی از نرم افزار های نصب شده )، می توانید از این نقاط بازگشت استفاده کرده و تنظیمات را به تاریخ قبل از بروز اشکال برگردانید.
    در Database هم با روش سوم می توانید یک یا چند نقطه ی بازگشت ایجاد کنید، البته نه برای روز های آتی، بلکه فقط در حد زمان ارتباط با Database ، که هر چه دیتابیس بزرگتر شده و یا عمل تغییر در بانک طولانی تر شود، کاربرد بیشتری پیدا می کند.
    برای اینکار به جای دستور

    sqlTransaction1 = sqlConnection1.BeginTransaction()
    از دستور زیر استفاده می کنیم:

    sqlTransaction1 = sqlConnection1.BeginTransaction("First")
    "First" در دستور بالا صرفا یک نام برای نقطه ی بازگشت است و هر نامی برای آن می توان انتخاب کرد. در این حالت، هم می توانید از دستور ()sqlTransaction1.Rollback استفاده کنید که به اولین نقطه ی پردازش نشده باز می گردد، و هم در صورتی که چند نقطه ی بازگشت داشته باشید، می توانید از دستور زیر استفاده کنید:

    sqlTransaction1.Rollback("Second")
    کلاس SqlTransaction همچنین دازای یک متد به نام Save است که به عنوان پارامتر، نام یک نقطه ی بازگشت را می گیرد، و تغییرات تا آن لحظه را در Database ذخیره می کند. کاربرد آن زمانی است که می خواهید قبل از پایان عملیات و فراخوانی متد Commit از شی، مقداری از اطلاعات را در Database تثبیت کنید:

    sqlTransaction1.Save("First")
    همان طور که قبل از شروع روش سوم گفتم، بحث در اینجا مقداری پیچیده می شود و نیاز به تمرکز بالا و تمرین و تکرار های فراوان دارد، هرچند دو روش اول در بیش از ۹۵ درصد اوقات جوابگوی نیاز شما هستند.
    مثال: کد زیر سابروتینی را نشان می دهد، که یک رکورد به جدول اضافه می کند. در این سابروتین از کلاس SqlTransaction برای عمل Transaction و همین طور از نقاط بازگشت استفاده شده است: ( این مثال ابدا توانایی نشان دادن قابلیت های نقاط بازگشت را ندارد، و باید با آنها در یک برنامه ی خاص که روش های اول و دوم در آن پاسخگو نیستند، روبرو شوید. با این همه این مثال فقط جهت نشان دادن ترتیب و نحوه ی استفاده ی کد های بالا ارائه شده است، و توضیح کلی آن ( که قبلا به صورت جزء به جزء توضیح داده شده است) را به شما واگذار می کنم. )

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #5 ارسال شده در تاريخ 11th December 2011 در ساعت 09:59

  6. *Mohammad* آواتار ها
    *Mohammad*
    مدیر سابق
    May 2011
    63,336
    22,637
    تشکر شده : 91,444

    پیش فرض

    نکته:روشهای دیگری هم برای عمل Transaction در .NET وجود دارند، از جمله استفاده از کلاس DependentTransaction ، که در برنامه های Multi Thread کاربرد دارد.
    نکته:روش اول در برخی از سیستمها به دلایل نامعلومی ناقص عمل کرده و تمامی اطلاعات را Rollback می کند. برای حل این مشکل، تعریف یک شی از TransactionScop را، به جای ابتدای سابروتین، بلافاصله قبل از باز کردن ارتباط انجام دهید.
    یک سوال: حال این سوال پیش می آید که بالاخره کدام روش را انتخاب کنیم ؟
    پاسخ: برای پاسخ به این سوال لازم است روش ها با هم مقایسه شده، و معایب و مزایای هر کدام بررسی شود:
    روش اول: این روش ساده ترین و سریعترین روش ممکن است. اگر در برنامه تان حالت خاصی وجود ندارد که بخواهید به صورت دستی آن را مدیریت کنید، این روش توصیه می شود، چون از آنجا که مدیریت آن به عهده ی خود NET. بوده، احتمال بروز خطا در آن بسیار کم است. ولی در این روش نمی توانید به صورت دستی آن را برنامه راکنترل کنید، البته راهی وجود دارد، و آن ایجاد عمدی یک استثناست. زیرا در این روش، موفقیت در احرا و یا بروز یک مشکل، تنها با استثنا ها بررسی می شود و این یعنی اینکه شما می توانید برای جایگزینی متد Rollback در این روش، با استفاده از دستور Throw یک استثناء به برنامه بفرستید، در این صورت متد Complete اجرا نخواهد شد و نتیجه مشابه فراخوانی متد Rollback در روش های دوم و سوم است. با این همه به دلیل حفظ نظم در ساختار برنامه، توصیه می شود برای کنترل دستی از روش های دوم و سوم استفاده کنید.
    ( اگر این روش را به عنوان روش اصلی انتخاب کنید، هنوز در کمتر از 5% مواقع (شاید اصلا برایتان پیش نیاید ) به روش سوم و در حدود 20% مواقع به روش دوم نیاز خواهید داشت. )
    روش دوم: این روش در حالت کلی و با در نظر گرفتن جنبه های مختلف ایده آل ترین روش است، نه محدودیت روش اول را دارد و نه پیچیدگی روش سوم را. البته به خاطر میانه رو بودن، هنوز از روش اول مقداری حجیم تر و از روش سوم مقداری محدود تر است. با این همه در صورتی که می خواهید همیشه از یک روش ثابت استفاده کنید، این روش، بهترین گزینه برای این کار است.
    ( اگر این روش را به عنوان روش اصلی انتخاب کنید، هنوز در کمتر از 5% مواقع (شاید اصلا برایتان پیش نیاید ) به روش سوم نیاز خواهید داشت. )
    روش سوم: این روش کاملترین و پیچیده ترین روش است، البته در صورتی که این روش را انتخاب کنید، می توانید همیشه مانند روش دوم (بدون استفاده از قابلیت نقاط بازگشت آن) از آن استفاده کنید ( و تنها یک خط اضافه تر کد بنویسید)، که در این صورت خصیصه ی پیچیدگی آن موقتا حذف می شود. در این صورت اگر زمانی به یک برنامه برخورد کردید که نیاز به روش سوم به طور کامل داشت، می توانید با اضافه کردن چند خط کد و چند نقطه ی بازگشت، از آن استفاده کنید.
    ( اگر این روش را به عنوان روش اصلی انتخاب کنید، در 99% مواقع جوابگوی نیاز شما خواهد بود. )

    پروژه ی نمونه :
    در پروژه نمونه ی ایجاد شده، عمل درج یکبار بدون Transaction و یک بار هم با هر کدام از روشها انجام شده است:
    در صورتی که می خواهید با طرز کار هر کدام از روش ها بیشتر آشنا شوید، لازم است که پروژه ای مانند این پروژه ایجاد کرده، و در هر سابروتین آن، دو بار عمل درج را انجام دهید. برای درج اول متد Commit و برای درج دوم متد Rollback را فراخوانی کنید.
    سخن پایانی :
    · از اینکه تا اینجا با من همراه بودید، کمال تشکر را دارم.
    · بحث در مورد Sql Transaction به این سه روش ختم نمی شود، بلکه هم روش های دیگری وجود دارند و هم هر روش جزئیات وسیعی را شامل می شود. با این همه به ارائه ی این سه روش اکتفا می کنم، بقیه ی مطالب را ( در صورتی که به آن احساس علاقه می کنید ) می توانید در MSDN دنبال کنید، هر چند در صورت ایجاد هر گونه ابهام و یا سوالی در مورد سایر روش ها، بنده در حد توان در خدمت دوستان هستم. · امیدوارم مرا از نظرات ، پیشنهادات و انتقادات خود مطلع کنید.

    نردبان این جهان ما و منیست
    عاقبت این
    نردبان افتادنیست
    لاجرم آن کس که بالاتر نشست
    استخوانش سخت تر خواهد شکست




    #6 ارسال شده در تاريخ 11th December 2011 در ساعت 10:00

موضوعات مشابه

  1. کتاب Professional iPhone and iPad Database Application Programming by Patrick Alessi
    توسط p h o e n i x در انجمن برق ، الکترونیک ، رباتیک و مخابرات
    پاسخ ها: 1
    آخرين نوشته: 21st August 2011, 10:59
  2. دانلود آموزش تصویری CBT Nuggets Exam Pack 70-433 Microsoft SQL Server 2008 Database Development Training
    توسط secret در انجمن Video Training (آموزشهای تصویری)
    پاسخ ها: 0
    آخرين نوشته: 16th July 2010, 11:47
  3. دانلود کتاب آموزش پایگاه داده و یا Database
    توسط Mr.MohaMmaD در انجمن کتاب های الکترونیک فارسی کامپیوتر
    پاسخ ها: 0
    آخرين نوشته: 25th July 2009, 08:33
  4. دانلود نرم افزار کدهای تقلب بازی ها با CheatBook DataBase 2009
    توسط ddr3 در انجمن نرم افزارهای یوتیلیتی(Utility) و متفرقه
    پاسخ ها: 0
    آخرين نوشته: 1st July 2009, 01:17
  5. حجم بالاي اطلاعات در Database و راهكارها
    توسط secret در انجمن برنامه نويسي عمومی
    پاسخ ها: 0
    آخرين نوشته: 31st December 2008, 00:20

علاقه مندی ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •