PDA

View Full Version : سوال: ترانزکشن درون sql و روی چند StoredProcedure جدا



hamid.shekasteh
جمعه 03 مهر 1388, 11:22 صبح
با سلام خدمت کاربران گرامی
من یه مشکل دارم که خیلی وقته مشغولم کرده و تا حالا به نتیجه ای هم نرسیدم، مشکل اینه که من برای ثبت یا ویرایش یه فاکتور می بایست چند جدول را مقدار دهی کنم و برای ثبت یک فاکتور چندین StoredProcedure به صورت کاملا جدا از هم اجرا می شوند. حالا می خوهم بدانم که آیا می شود که من بدون اینکه از کلاس sqlTransaction درون .net استفاده کنم با StoredProcedure این ترانزکشن ها را ایجاد کنم و در StoredProcedureهای مربوط به فاکتور هم تغییری ندهم.
(به دلیل ماهیت برنامه ام نمی توانم از این کلاس استفاده کنم و با خطا روبرو می شوم)

من چیزی شبیه کد زیر می خواهم:


begin transaction t1




اجرای کد درون برنامه




در صورت موفقیت در اجرای کد commit transaction t1



در صورت شکست در اجرای کد rollBack transaction t1


از شما بزرگواران می خوام که اگر راهی بلدید جلوی پای من بگذارید،با تشکر

hamid.shekasteh
شنبه 04 مهر 1388, 14:12 عصر
من مشکلم رو به یه صورت دیگه می گم شاید یکی از اساتید کمکم کنه.
من می خواهم دستور Begin tran رو هر جایی خواستم بدم(در برنامه یا دستی یا ...)
بعد هر تغییری که خواستم بدم(در کد یا دستی یا با Store Procedure ...)
در آخر دستور Commit یا RollBack را بدهم و نتیجه بگیرم.
با تشکر

hassanf
شنبه 04 مهر 1388, 22:31 عصر
سلام
اگه منظورت اینه که چند تا پروسیجر داری و می خواهی همشمون داخل یک تراکنش باشند، می تونی یه پروسیجر دیگه بنویسی و بقیه پروسیجر هارو داخل او اجرا کنی. انجوری :



Begin transaction
execute sp1 parameters

If @@Error <> 0
Rollback
execute sp2 parameters
If @@Error <> 0
Rollback
execute sp3 parameters
If @@Error <> 0
Rollback
.
.
.
.
.
.
.
Commit

hamid.shekasteh
چهارشنبه 08 مهر 1388, 21:59 عصر
نه منطورم اینه که ترانزکشن توی یه SP شروع بشه و توی یه SP دیگه تمام بشه
آیا چنین چیزی ممکنه؟

hassanf
پنج شنبه 09 مهر 1388, 21:33 عصر
سلام
بله امکان پذیره.
به شرطی که تراکنش اسم داشته باشه.


Begin Tran T1
Commit TranT1
Rollback Tran T1

hamid.shekasteh
جمعه 10 مهر 1388, 10:15 صبح
هنوز امتحان نکردم اما به خاطر توجه و همکاری شما خیلی ممنونم.

hamid.shekasteh
شنبه 11 مهر 1388, 15:20 عصر
دوست عزیز اگر من تراکنش را در یک SP شروع کنم با خطای زیر مواجه می شوم ونمی تونم در یه SP دیگه تراکنش را تمام کنم.

این کد StoreProcedure برای Begin





CREATE PROCEDURE [StartTran] AS





BEGIN TRANSACTION TranName


GO



این کد StoreProcedure برای RollBack





CREATE PROCEDURE [RollBackTran] AS


RollBack TRANSACTION MyTransaction


GO

این کد StoreProcedure برای Commit






CREATE PROCEDURE [CommitTran] AS


COMMIT TRANSACTION MyTransaction


GO



این خطا پس از اجرای StartTran


Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.

مشکل از کجاست؟

hamid.shekasteh
دوشنبه 13 مهر 1388, 22:24 عصر
من برنامه رو آپلود کردم . ببینیدش نظرتون رو دربارش بگید و اگه راه حلی برای مشکل تراکنش های برنامه دارید بفرمایید.
با تشکر

دانلود کنید-سورس برنامه مدیریت فروشگاه
http://www.barnamenevis.org/forum/showthread.php?t=182746

AminSobati
یک شنبه 26 مهر 1388, 13:10 عصر
سلام دوست عزیزم،
زمانی که اجرای برنامه وارد یک SP میشه و زمانی که از SP خارج میشه، تعداد tranها نباید تغییر کرده باشه. برای همین نمیتونین با Tran باز وارد SP بشین و داخل SP اون رو commit کنین. ولی میتونین از Save Point استفاده کنین. مثلا در ابتدای SP مقدار Trancount@@ رو چک کنین، اگر Tran باز شده، یک Save Point بزنین و اگر باز نیست، Begin tran کنین. برای کار با Save Point دستور Save Tran رو در Books Online ببینید

hamid.shekasteh
دوشنبه 27 مهر 1388, 15:50 عصر
جناب ثباتی شما به نکته مهمی اشاره کردید که در هنگام Rollback یا Commit به کار من می آید اما فعلا مشکل من اینجاست که وقتی SP شروع با نام StartTran را اجرامی کنم با خطایی که در بالا گفتم مواجه می شوم.من فکر می کنم که این خطا به دلیل این است که باید در همان SP شروع دستور Rollback یا Commit اجرا شوند.

و دو سوال مهم دیگر:
1- تراکنشی که شروع می شود فقط برای کانکشن است برای مثال می توان یک تراکنش را شروع کرد و یک سری دستور در محیط .net اجرا کرد (این دستورات با کانکشن های متفاوت اجرا می شوند) و سپس تراکنش را Rollback کرد؟
2- اگر فقط یک تراکنش داشته باشیم و پس از شروع تراکنش برای اجرای چندین کار متفاوت چندین بار کانکشن را open-Close کنیم تراکنش به درستی اجرا می شود؟

AminSobati
جمعه 01 آبان 1388, 21:16 عصر
میتونین یک SP مادر داشته باشید که کارش آغاز Tran و فراخوانی بقیه SPهای تو در تو باشه و نهایتا همون SP اولی commit یا rollback انجام بده. در مورد دو سوالتون، شاید این پاسخ به هر دو کمک کنه:
هر Tran منحصر به یک Connection هست و از طریق Connectionهای دیگه نمیشه اون رو commit کرد. ولی Connection بسته میشه و Tran باز بوده، مثل اینه که Rollback انجام دادین