PDA

View Full Version : سی و بانک اطلاعاتی



Happy_davood
یک شنبه 08 بهمن 1385, 11:56 صبح
سلام
خوب من یه سری از عملیات ها رو مجبورم که روی چند تا جدول انجام بدم و معمولاً این جور عملیات ها رو در Stored Proc انجام می دم تا درصورت خطا بشه RolBack کرد .

منتهی یه سری از عملیاتها هستند که باید پشت سر هم انجام بگیرند و هر کدوم با یک جدول جداگانه کار می کنند ولی امکان پیاده سازی بوسیله SP وجود نداره و باید چند تا SP رو پشت سر هم فراخوانی کرد . خوب در اینصورت چطوری میشه RollBack کرد .

اصلاً روش کار در این گونه موارد چیه ؟

iman_s52
یک شنبه 08 بهمن 1385, 13:00 عصر
اگه فراخوانی همه SP ها رو تویه یه SP جدید انجام بدی چی میشه ؟؟
جواب میده ؟

someCoder
یک شنبه 08 بهمن 1385, 13:04 عصر
منتهی یه سری از عملیاتها هستند که باید پشت سر هم انجام بگیرند و هر کدوم با یک جدول جداگانه کار می کنند ولی امکان پیاده سازی بوسیله SP وجود ندارهمثل چی؟ یه مثال بزن

Happy_davood
یک شنبه 08 بهمن 1385, 16:58 عصر
خوب مثلاً یه فرم مثل فاکتور رو در نظر بگیرید که قسمت بالای اون یکبار و در یک جدول ذخیره میشه و و قسمت پائین یا همون سطر های فاکتور به تعداد سطرهاش در یک جدول دیگه ذخیره میشند . فرض کنید قسمت بالا ذخیره شد . دو تا ردیف رو هم پشت سر هم ذخیره کردیم . موقع ذخیره سطر سوم خطا پیش اومد . الان تکلیف اون دو تا سطر و قسمت بالای فاکتور چیه ؟ در نظر داشته باشدی که تا حالا دو تا SP رو جمعاً سه بار اجرا کردیم !

ali_kolahdoozan
یک شنبه 08 بهمن 1385, 17:27 عصر
از transaction ها استفاده کن توی خود دات نت . اگر خطا رخ داد همه رو rallback کن

DonetKarvb
سه شنبه 10 بهمن 1385, 14:05 عصر
سلام
خوب من یه سری از عملیات ها رو مجبورم که روی چند تا جدول انجام بدم و معمولاً این جور عملیات ها رو در Stored Proc انجام می دم تا درصورت خطا بشه RolBack کرد .

منتهی یه سری از عملیاتها هستند که باید پشت سر هم انجام بگیرند و هر کدوم با یک جدول جداگانه کار می کنند ولی امکان پیاده سازی بوسیله SP وجود نداره و باید چند تا SP رو پشت سر هم فراخوانی کرد . خوب در اینصورت چطوری میشه RollBack کرد .

اصلاً روش کار در این گونه موارد چیه ؟

راه های مختلفی داره و روز به روز هم داره بهتر میشه. باید شرایط رو دید.

خوب مثلاً یه فرم مثل فاکتور رو در نظر بگیرید که قسمت بالای اون یکبار و در یک جدول ذخیره میشه و و قسمت پائین یا همون سطر های فاکتور به تعداد سطرهاش در یک جدول دیگه ذخیره میشند . فرض کنید قسمت بالا ذخیره شد . دو تا ردیف رو هم پشت سر هم ذخیره کردیم . موقع ذخیره سطر سوم خطا پیش اومد . الان تکلیف اون دو تا سطر و قسمت بالای فاکتور چیه ؟ در نظر داشته باشدی که تا حالا دو تا SP رو جمعاً سه بار اجرا کردیم !
من در اینجور مواقع بهترین راه حل رو استفاده از XML ها میبینم. البته در SQL Server 2005
اگر از SQL 2000 استفاده کنید این شیوه به درد شما نمیخورد. و باید از شِوه های نظیر شیوه کلاهدوزان استفاده کرد.

از transaction ها استفاده کن توی خود دات نت . اگر خطا رخ داد همه رو rallback کن
علی جان این کار یک اشتباه بزرگ است. ممکن است یک Transaction توسط کلاینت باز شود و کاربر بدون توجه به باز بودن ترنزکشن در کارهایش وقفه ایجاد کنه( مثلا" میز کارش را ترک کند:گیج:) و یا شاید اینکه هنگام فرستادن اطلاعات ارتباطش با سرور قطع شود. در این زمان است که کاربر و یا همان کلاینت تعداد زیادی از رکورد ها رو Lock کرده و دیگران منتظر اتمام کار این شخص هستند.

برای سرعت بالاتر و کاهش اطلاعاتی که در شبکه رد و بدل میشود بهتر از که Transaction از در یک Sp باز شود و در همانجا همه حالات بررسی شود. اگر اطلاعات ثبت شد که هیچ در غیر اینصورت توسط errorHandling داخل SP این عملیات Roolbackَ شود.

ali_kolahdoozan
سه شنبه 10 بهمن 1385, 16:58 عصر
شما اصلا میدونی transaction چیه که نامه می نویسی در جوابش ؟‌ چه فرقی داره توی sp باشه یا بیرون؟

DonetKarvb
سه شنبه 10 بهمن 1385, 19:35 عصر
شما اصلا میدونی transaction چیه که نامه می نویسی در جوابش ؟‌ چه فرقی داره توی sp باشه یا بیرون؟
یه کوچولو در مورد اون و همزمانی کاربران مطالعه داشتم. حالا شما اگر فکر میکنید اشتباه میگم شما بهترش رو بگید.:تشویق:

ali_kolahdoozan
سه شنبه 10 بهمن 1385, 19:42 عصر
عزیزم ایجا بحث همزمانی نیست . اون چیز دیگس

DonetKarvb
سه شنبه 10 بهمن 1385, 20:08 عصر
عزیزم ایجا بحث همزمانی نیست . اون چیز دیگس
به جرات میتونم بگم که بحث همزمانی کاربران و Trancation های خیلی به هم نزدیک هستند. بازم حرف شما درست. خوب در مورد Transaction میشه بگی که کجا اشتباه کردم؟

Behrouz_Rad
سه شنبه 10 بهمن 1385, 21:05 عصر
این سوال رو باید در بخش SQL Server مطرح میکردی...
پیاده سازی کاری که میخوای انجام بدی ساده ست!
تو چند SP داری که قصد داری این SP ها همگی در یک SP ی پدر اجرا بشن و در صورتی که یک SP نتونست با موفقیت وظایفش رو انجام بده، کلیه ی کارهای SP های قبلی لغو بشه.
بسیار خوب.
تو این امکان رو داری که تراکنش ها رو به صورت سلسله مراتبی اجرا کنی.
SP های فرزند تو به شکل عادی اجرا میشن، مراحل انجام تراکنش رو در خودشون پیاده سازی و اجرا می کنند.
تفاوتی که در این حالت وجود داره اینه که:
برای اینکه متوجه بشی یک SP کارش رو با موفقیت انجام داده یا خیر، باید با استفاده از دستور RETURN در T-SQL، در صورت موفقیت تراکنش (COMMIT) مثلا مقدار 1 و در صورت عدم موفقیت تراکنش (ROLLBACK) مثلا مقدار صفر رو برگشت بدی.
حال در SP پدر، ضمن ایجاد ساختار TRANSACTION، مقدار برگشتی هر SP ی فرزند رو با یک دستور IF بررسی می کنی و در صورتی که مقدار برگشتی "1" بود، SP ی بعدی رو اجرا می کنی و اینکار رو تا تمام شدن SP ها انجام میدی و در نهایت COMMIT می کنی؛ و در صورتی که مقدار برگشتی "صفر" بود، ROLLBACK می کنی و پایان ماجرا!
به همین سادگی...

موفق باشید.

Happy_davood
چهارشنبه 11 بهمن 1385, 12:35 عصر
خوب این پیشنهاد شما یک روش اصولی و البته عادی هست . به نظرم شما متوجه منظور من نشدید . من چند تا SP رو دنبال هم از درون برنامه اجرا می کنم و نه از دورن یک SP پدر .
مثلاً یک SP قسمت بالای فاکتور رو ذخیره میکنه و کنترل برمی گرده به برنامه . بعد در داخل یک حلقه و به تعداد سطر های فاکتور یک SP فراخوانی میشه و در هر بار فراخوانی یک سطر فاکتور وارد جدول میشه .

همینطور که می بینید این موضوع تنها به sql مربوط نمیشه بلکه به روش برنامه نویسی در C# هم ارتباط داره . موضوع در طرف SQL طبق نوشته های شما خیلی ساده و مصطلح است .

zerobit-ltd
چهارشنبه 11 بهمن 1385, 13:00 عصر
به نظر من بهترین کار اینه که تمام اطلاعات رو یکدفعه سمت server بفرستی و sp هات رو از داخل همون sp پدر فراخوانی کنی.


در داخل یک حلقه و به تعداد سطر های فاکتور یک SP فراخوانی میشه و در هر بار فراخوانی یک سطر فاکتور وارد جدول میشه .
به نظر من تمام این داده ها رو به هم بچسبون، بعد سمت server اونها رو از هم جدا کن (مثلا یه function مثل Split بنویس ) و بعدش اونا رو insert کن. اگر حجم داده ها زیاد نباشه، مشکلی به وجود نمباد. شاید زیاد اصولی نباشه، ولی خب کار راه اندازه.

ali_kolahdoozan
چهارشنبه 11 بهمن 1385, 13:08 عصر
شما میتونی چندین sp رو بدون sp پدر و ... از درون دات نت با استفاده از transction دورن خود دات نت اجرا کنی یا همه رو کنسل کنی .

DonetKarvb
چهارشنبه 11 بهمن 1385, 13:25 عصر
به نظر من بهترین کار اینه که تمام اطلاعات رو یکدفعه سمت server بفرستی و sp هات رو از داخل همون sp پدر فراخوانی کنی.
به نظر من تمام این داده ها رو به هم بچسبون، بعد سمت server اونها رو از هم جدا کن (مثلا یه function مثل Split بنویس ) و بعدش اونا رو insert کن. اگر حجم داده ها زیاد نباشه، مشکلی به وجود نمباد. شاید زیاد اصولی نباشه، ولی خب کار راه اندازه.
اتفاقا" خیلی هم اصولی است. چون با این کار باعث کاهش ترافیک در شبکه میشیم. من از XMl نام بردم که دقیقا" همینکار رو میکنه. شما اطلاعات رو در غالب یک متغییر XML به سمت سرور میفرستید و در آنجا با یک کوئری ساده ( بدون حلقه البته) این داده ها رو وارد جدول میکنید.

Happy_davood
جمعه 13 بهمن 1385, 09:58 صبح
آقای کلاهدوزان می تونید درباره Transaction داخل دات نت بیشتر توضیح بدید ؟

ali_kolahdoozan
جمعه 13 بهمن 1385, 10:04 صبح
شما sqltransaction رو درون msdn سرچ کن . اگر چیزی متوجه نشدی با من

Happy_davood
جمعه 13 بهمن 1385, 10:06 صبح
میشه برای این دو تا پست آخر بیشتر توضیح بدید ؟

jeus
چهارشنبه 06 تیر 1386, 11:45 صبح
من یه چیز رو توی این همه پست نفهمیدم roolback درسته یا rallBack یا rolback کدومشون درستن و معنیش چی میشه ؟