ورود

View Full Version : لغو كامل چند عمليات در صورت بروز مشكل در يكي از آنها



gama118
سه شنبه 25 آبان 1389, 11:17 صبح
سلام

من واسه آلبوم تصوير يه ركود ذخيره مي كنم كه يه فيلدش نام فايلي هست كه مي خواد آپلود بشه
كاربر فيلدهاي ديگه ركورد رو پر مي كنه بعد فيل رو واشه آپلود انتخاب ميكنه و در آخر با زدن دكمه ذخيره تو رويداد كليك دكمه دو تا تابع يكي واسه آپلود و يكي واشه ذخيره ركورد نوشتم حالا اگه يكيش به مشكل بربخوره بايد اون يكي هم لغو شه
دستوري واشه اينكه از در هر قسمت اين دو تا تابع مشكل وجود داشته كل دستورات اجرا شده در رويداد كليك لغو بشه وجود داره يا بايد خودم با كد نويسي شبيه سازيش كنم؟

مثلا تو sql server دستور rollback هست

majnun
سه شنبه 25 آبان 1389, 11:39 صبح
از try catch استفاده کن دوست من

alonemm
سه شنبه 25 آبان 1389, 11:43 صبح
میتونی از بلوک کد نویسی


try() catch() finali()

استفاده کنی.

pedram_ns
سه شنبه 25 آبان 1389, 11:46 صبح
همونطور که دوستان گفتن از try استفاده کن اول چک کن ببین آپلود تصویر روی هاست درست انجام بشه اگر درست بود با همین تابع چک کن که اطلاعات در دیتابیس به درستی درج می شه اگر شد که شد و کار تمامه و اگر نشد می تونی یک دستور بنویسی که اون فایل آپلود شده حذف بشه.

gama118
سه شنبه 25 آبان 1389, 12:04 عصر
خوب اينكه بازم دستي شد
گفتم اين دو تا كار تو دو تا تابع انجام ميشه
اگه try بزارم تو دو تا تابع اولي try به مشكل برنمي خوره و انجام ميشه ميره تابع دوم اونجا به مشكل بر ميخوره try لغوش ميكنه ولي تابع اول كه ديگه اجرا شده
آيا اگه اين دو تا تابع رو بزارم تو يه try-catch مشكلم حل ميشه؟

leila_mahyanet
سه شنبه 25 آبان 1389, 12:39 عصر
من فکر نمیکنم try کمک کنی . چون به قول خودتون اگر تابع اول فرضا مشکلی نداشته باشه در هر صورت اجرا میشه .

من از flag استفاده میکنم . یه flag با مقدار اولیه false تعریف میکنم و در صورت اتمام تابع اول مقدار اون رو به true تغییر میدم . و تابع دوم رو داخل یه شرط if میزارم که در صورت true بودن flag اتفاق میفته.

unishomal
چهارشنبه 26 آبان 1389, 12:24 عصر
دوستان یه سوال؟!!!!!!!!!!!!!!!!!!!!! این وسط کسی نمی خواد از ترانزکشن بگه؟

gama118
شنبه 29 آبان 1389, 09:03 صبح
ترانزکشن چيه ؟؟ كمكي به اين مسئله ميكنه؟

mehdi.mousavi
شنبه 29 آبان 1389, 11:07 صبح
سلام.
روش صحیح برای انجام اینکار (همونطور که UniShomal گفتن) استفاده از Transaction هاست. شرایطی رو در نظر بگیرید که در اون یک عملیات مشخص به چند بخش مجزا تقسیم میشه و ما مایل هستیم تا کلیه اون اجزا بصورت "موفقیت آمیز" یا "نا موفقیت آمیز" به انجام برسه. در واقع اجرای این اجزا در وضعیتی میانی رها نشه. هر وقت با چنین شرایطی مواجه بودید، اولین و آخرین راه استفاده از Transaction هاست. حالا ایشون میخوان "نوشتن فایل" و "نوشتن در بانک" رو بصورت Transactional انجام بدن، یعنی یا هر دو موفقیت آمیز انجام بشه، یا هیچ یک انجام نشه. اما همون نوشتن در بانک نیز میتونه خودش Transactional باشه. فرض کنید در ثبت رکورد نیاز باشه چند جدول در بانک Update بشه، بدین ترتیب برای حفظ Integrity بانک، اصلا علاقه نداریم تا یکی از جدولها به روز بشه اما جدولهای دیگه دست نخورده باقی بمونه (بواسطه خطایی که فرضا ایجاد میشه).

خوشبختانه در .NET امکان استفاده از Transaction ها بسیار ساده شده و دیگه نیاز به دونستن مفاهیم Enlist کردن در یک Transaction یا دونستن Resource Manager و ... نیست. کافیه تا با استفاده از کلاس TransactionScope به سادگی یک Transactional Code Block داشته باشیم. به بیان دیگه:

using (TransactionScope transactionScope = new TransactionScope())
{
//INSERT Data into bank

//Alter files...

transactionScope.Complete();
}

اینجا، من هر کاری در Code Block فوق انجام بدم، Transactional انجام خواهد شد. اگر اجرا به خط transactionScope.Complete() برسه، تراکنش با موفقیت Commit میشه و اطلاعات و تغییرات در فایل ثبت میشه و اگر به اون نقطه نرسه (فرضا تغییر در فایل Exception ایجاد کنه یا ثبت در بانک Fail بشه) دیگه transactionScope.Complete() اجرا نمیشه و تراکنش Rollback میشه.

فقط حواستون باشه که استفاده از این، بسته به شرایط و کاری که میخواهید انجام بدید در ASP.NET ممکنه نیاز به دسترسی Full Trust داشته باشه که سمت Hosting شما غیر فعال باشه.

موفق باشید.

پاورقی: خیلی متاسف شدم از پاسخ هایی که در این Thread دیدم. وقتی یه نفر گفت از try/catch استفاده کن، لازم نیست 20 نفر دیگه هم بیان بگن از try/catch استفاده کن. :(