PDA

View Full Version : استفاده صحیح از تراکنش در ADO چگونه است



بهمن بهار
چهارشنبه 07 دی 1384, 06:32 صبح
با عرض سلام و احترام به دوستان خوب برنامه نویس
من برای استفاده از شیوه صحیح تراکنش احتیاج به راهنمایی دارم
برنامه مورد نظر بر روی شبکه باید اجرا شود بانکهای اطلاعاتی Sql هستند و من از کدهای زیر استفاده کرده ام

ADOConnection1.BeginTrans;
try
ADOQuery1.Append; یا ADOQuery1.Edit
....
ADOQuery1.Post;
Except
ADOConnection1.RollbackTrans;
Exit;
end;
ADOConnection1.CommitTrans;

اصلا آیا استفاده از ADOQuery برای این تراکنش درست است یا باید برای این مورد از ADOTable استفاده کنم و یا اگر هردو اشتباه است روش صحیح کدام است.
سئوال دیگر اینکه در بعضی از قسمتها بعد از بروز اشکال و اجرای ADOConnection1.RollbackTrans باز هم اطلاعات جدید یا ویرایش شده در بانک اطلاعاتی ذخیره میشود. علت چیست ؟ چرا Transaction به درستی عمل نمی کند. آیا این امکان وجود دارد که به علت استفاده از Try /Except دیگری قبل از این قسمت برنامه با این اشکال روبرو شود یا مشکل از کدنویسی همین قسمت است.
اصلا چه زمانی اطلاعات به سرور ارسال میشوند وقتی Post انجام شد یا وقتی که ADOConnection1.CommitTrans اجرا شود.

لطفا نگویید که جستجو کنید چون جستجو کردم ولی به جواب مورد نظرم نرسیدم و با جوابهای متناقض روبرو شدم
مثلا در تاریخ
Thursday 06 January 2005, 08:55 AM آقا یا خانم YASNA
برای استفاده از transaction در ADOCONNECTION این طور عنوان کرده بودندکه
<<اگر برنامه شما قرار است در شبکه کار کند بهتر است از این دستور استفاده نکنید>>
ولی در تاریخ Friday 04 November 2005, 12:27 AM آقای کشاورز در مورد Transaction A و Transaction B توضیحاتی داده اند که البته باز هم من به جوابم نرسیدم

لصفا مرا راهنمایی کنید فکر کنم در این زمینه من اصلا توی باغ نیستم.

vcldeveloper
پنج شنبه 08 دی 1384, 03:19 صبح
اصلا آیا استفاده از ADOQuery برای این تراکنش درست است یا باید برای این مورد از ADOTable استفاده کنم و یا اگر هردو اشتباه است روش صحیح کدام است.

در این مورد فرق چندانی با هم نمی کنند.



اصلا چه زمانی اطلاعات به سرور ارسال میشوند وقتی Post انجام شد یا وقتی که ADOConnection1.CommitTrans اجرا شود.


بستگی داره که از چه LockType ایی استفاده می کنید، اگه از ltBatchOptimistic استفاده می کنید، اطلاعات زمانی برای سرور ارسال می شند که UpdateBatchفراخوانی شده باشه، در غیر اینصورت فراخوانی Post باعث ارسال تغییرات به سرور بانک اطلاعاتی میشه.
تراکنش ها توسط سرور بانک اطلاعاتی کنترل میشند. با فراخوانی CommitTrans در واقع از SQL Server درخواست می کنید که تغییرات ایجاد شده در داخل تراکنش را اعمال کنه. بعد از شروع یک تراکنش، تا زمانی که CommitTrans فراخوانی نشه، تغییری هم ثبت نمیشه.

mzjahromi
پنج شنبه 08 دی 1384, 13:59 عصر
به نظر من اگر کدتون رو اینطور بنویسید بهتره


ADOConnection1.BeginTrans;
try
ADOQuery1.Append; یا ADOQuery1.Edit
....
ADOQuery1.Post;
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
Exit;
end;

بهمن بهار
جمعه 09 دی 1384, 04:04 صبح
با عرض ادب و احترام به تمامی دوستان خوب برنامه نویس
با تشکر از راهنمایی شما
پس با این تفاسیر این روش برای شبکه ایرادی ندارد ؟ آیا درست میگویم.؟
یک نکته میماند که تکلیف کاربرهای دیگر درهنگام ویرایش یا اضافه کردن چه میشود یعنی SQL چطور آنها را مدیریت میکند . یا مدیریت با برنامه نویس است.
فقط هنوز به این مطلب پی نبردم که چرا گاهی اوقات ADOConnection1.RollbackTrans درست عمل نمیکند و بازهم تغییرات یا اطلاعات جدید در جدول اعمال میشود.
آیا این امکان وجود دارد که به علت استفاده از Try /Except دیگری قبل از این قسمت برنامه با این اشکال روبرو شود یا مشکل از کدنویسی همین قسمت است.
یک سئوال کوچولوی دیگر با عرض پوزش !
در یک برنامه چون تعداد جدولها زیاد است من سعی کرده ام فقط از ADOQuery استفاده کنم (برای کمتر شدن حافظه اشغال شده توسط برنامه) آیا این روش درست است.و اگر در یک برنامه تعداد جداول زیادی وجود داشت برای اینکه حافظه اشغال شده توسط برنامه به حداقل برسد چه روشهایی را پیشنهاد میکنید.
راستی 3 روز است که ترکیب شکل ظاهری سایت در سیستم من عوض شده. چون سیستم را فرمت کردم و دوباره ویندوز نصب کردم اینطوری شده یا برای همه این شکل و شمایل جدید آمده ؟


با تشکر قبلی از همه دوستان خوب بخصوص آقای کشاورز که همیشه برای همه دلگرمی به ارمغان میآورد.

vcldeveloper
شنبه 10 دی 1384, 02:09 صبح
تکلیف کاربرهای دیگر درهنگام ویرایش یا اضافه کردن چه میشود یعنی SQL چطور آنها را مدیریت میکند . یا مدیریت با برنامه نویس است.

این مسئله با استفاده از خاصیت IsolationLevel از AdoConnection کنترل میشه. این خاصیت نحوه دسترسی سایر کاربران به اطلاعاتی که در حین تراکنش تغییر کرده اند را مشخص میکنه.



چرا گاهی اوقات ADOConnection1.RollbackTrans درست عمل نمیکند و بازهم تغییرات یا اطلاعات جدید در جدول اعمال میشود.


ممکنه مشکل از کدهایی باشه که شما نوشتید.



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


1- سعی کنید نتایج Query ها را محدود کنید، یعنی فقط رکوردها و فیلدهایی که برای کار خاصی نیاز دارید را درخواست کنید، نه اینکه برای هر کار کوچکی کل داده های جدول را درخواست کنید.
2- جداولی را که لازم نیست همیشه باز باشند، را ببندید و فقط زمانی که به آنها نیاز دارید، آنها را باز کنید. البته برای جداولی که به دفعات باز و بسته می شوند، بهتره فقط یکبار اونها را باز کنید و تا پایان کار آنها را نبندید، چون زیاد باز/بسته کردن جداول هم خودش موجب اتلاف منابع سیستم میشه.

بهمن بهار
یک شنبه 11 دی 1384, 23:43 عصر
با عرض ادب و اجترام
آقای کشاورز از راهنمایی های ارزنده شما بسیار متشکرم
از شما خواهشی دارم اگر ایرادی ندارد لطفا مرا در این مورد هم راهنمایی کنید.
حدود 10 روز پیش سئوالی در مورد کار با تجهیزات پراکسیم کرده بودم که مدیر سایت آنرا به انجمن
شبکه ها انتقال داده ولی تاکنون کسی به آن جواب نداده اگر زحمتی نیست یه نگاهی بیندازید در صورت امکان مرا راهنمایی کنید.
با تشکر قبلی
بهمن بهار

vcldeveloper
دوشنبه 12 دی 1384, 01:49 صبح
حدود 10 روز پیش سئوالی در مورد کار با تجهیزات پراکسیم کرده بودم که مدیر سایت آنرا به انجمن
شبکه ها انتقال داده ولی تاکنون کسی به آن جواب نداده اگر زحمتی نیست یه نگاهی بیندازید در صورت امکان مرا راهنمایی کنید.

متاسفانه بنده اطلاعی در این مورد ندارم؛ اینو باید دوستانی که اطلاعاتی از تجهیزات شبکه دارند جواب بدند.