ايران ويج

نسخه‌ی کامل: تراکنش در اس کیو ال
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
با سلام
می خواهم بدونم چطوری میتونم یک تراکنش بنویسم در SQL که یک سری کار را انجام بده بعد COMMIT بشه بعد اگه اون یک سری کار با مشکل بر خود کرد دستور ROLLBACK اجرا بشه.

یعنی چطوری می تونم این دو دوستور بالا را باهم در sql server استفاده کنم که اگه دستور COMMIT با مشکل بر خورد دستور ROLLBACK اجرا بشه.

یعنی یک چیزی شبیه دستور Try  Except در دلفی.

من توی هر نمونه کدی که دیده بودم دستور COMMIT و ROLLBACK به صورت جدا در تراکنش ها توضیح داده بود.

فرض کنید من می خواهم در یک تراکنش بنویسم یک رکورد را حذف کن بعدش دستور COMMIT  باشه که این عمل اگه موافقعیت آمیز بود ذخیره شود و اگه مشکلی پیش آمد دستور ROLLBACK  اجرا بشه.

با تشکر از شما دوستان عزیز ممنون میشم اگه کمک کنید.  :():
کد:
BEGIN TRY

   BEGIN TRANSACTION
       exec( @sqlHeader)
       exec(@sqlTotals)
       exec(@sqlLine)
   COMMIT
END TRY
BEGIN CATCH

   IF @@TRANCOUNT > 0
       ROLLBACK
END CATCH


در صورتی که بلاک TRY دچار مشکل شود، کل بلاک Stop شده و وارد بلاک CATCH میشود، چون ترنسکشن نا تمام مانده، RollBack میشود.
ممنون دوست عزیز فقط ...

اگه من چند تا تراکنش داشته باشم چی میشه؟؟؟ چون یک جایی خوندم با هر بار اجرای تراکنش یکی به مقدار TRANCOUNT اضافه میشه و با اجرای هر بار دستور ROLLBACK یکی کم میشه از این مقدار؟؟

الان این کدی که شما لطفا کردید و نوشتید برای تراکنش های تودر تو هم کار می کنه؟؟؟

با تشکر فراوان
خب الان توی این دستوری که ارسال کردم، سه تا EXEC وجود داره، یعنی سه تا دستور مختلف داره اجرا میشه(البته توی این مثال، داره SP اجرا میکنه، شما میتونید به جاش از دستورات خودتون استفاده کنید)

اونجایی هم که نوشته بزرگتر از صفر، خب به تعداد دستوراتی که میخواین اجرا بشن، تغییرش بدین، مثلاً میخواین 5 تا دستور اجرا کنید، مینویسید 5
پس برای مثال من باید 5 تا دستور BEGIN TRANSACTION داخل یک بلوک تعریف کنم که هر کدام کار خاصی انجام میدن که به هم وابسته هستند و در آخر هم کد زیر بنویسم دیگه درسته؟


کد:
BEGIN CATCH
    IF @@TRANCOUNT > 5  
      ROLLBACK  
END CATCH
لطفا میشه بگید دقیقا کد زیر چه کاری انجام میده؟

کد:
IF @@TRANCOUNT > 0
من تو پاسخ قبلی، مطلبی رو اشتباه گفتم که عذر خواهی میکنم

شما به ازای هر BEGIN TRANSACTION ای که باز میکنید، یکی به مقدار @@TRANSACTION اضافه میشه
همینطور هم برعکسش اتفاق میوفته زمانی که شما COMMIT کنید، پس به ازای هر COMMIT هم یکی از @@TRANSACTION کم میشه.

پس توی مثال بالا، شما هر چند تا دستور هم که بنویسید، در ابتدا @@TRANSACTION میشه یک، اگه همه دستورات اجرا بشن و مشکلی پیش نیاد، برنامه به خط COMMIT میرسه، پس @@TRANSACTION میشه صفر مجدداً. اما اگه توی دستوراتی که نوشتید، مشکلی ایجاد بشه، چون برنامه از بلاک میپره بیرون دیگه دستور COMMIT اجرا نمیشه، پس @@TRANSACTION همون 1 باقی میمونه، پس توی بلاک پایین، چون @@TRANSACTION بیشتر از صفر هست، عملیات ROLLBACK انجام میشه.

امیدوارم تونسته باشم منظورمو برسونم.