PDA

View Full Version : استفاده از تراكنش و dbNavigator



Developer Programmer
جمعه 22 شهریور 1387, 10:33 صبح
سابق بر اين، من واسه راحتي كار، به جاي اينكه واسه ركورد جديد ، حذف و ويرايش... Button هاي مجزا بذارم، از dbNavigator استفاده ميكردم. اما حالا لازم شده كه در برنامه از تراكنش هم استفاده كنم.

آيا واسه پذيرش يه تراكنش حتما بايد از دستورات خود SQL مثل Insert Into استفاده كرد؟ ميشه از Event هاي Ado يا dbNavigator قبل و بعد از ركود جديد استفاده كرد؟


BeginTrans
Insert;
FieldByName('pID').AsInteger:= 10;
Post;
CommitTrans

vcldeveloper
جمعه 22 شهریور 1387, 17:30 عصر
نه، از خودِ AdoConnection هم میتونی استفاده کنی:


AdoConnection1.BeginTrans;
try
// Put your code here

AdoConnection1.CommitTrans;
except
AdoConnection1.RollbackTrans;
end;

Developer Programmer
جمعه 22 شهریور 1387, 21:15 عصر
علي جان الهي من دور سرت بگردم، منظورم رو نميتونم برسونم.
ببين... موقع درج ركورد جديد رو در نظر بگير...
ميشه داخل Event اي BeginTrans نوشت و بعد داخل يه Event ديگه Commit نوشت ؟ (مثل BeforPost & AfterPost)
ميشه قبل و بعد از FieldByName هم تراكنش رو نوشت ؟ يا حتما بايد تراكنش به فرم زير باشه؟


BeginTrans
Insert into Table1
CommitTrans

vcldeveloper
شنبه 23 شهریور 1387, 04:38 صبح
آره میشه، وقتی متد AdoConnection.BeginTrans را اجرا میکنی، کل کارهایی که از طریق هر کدوم از دیتاست هایی که به اون کانکشن متصل هستند، انجام میدی، داخل Transaction هستند، تا زمانی که CommitTrans یا RollbackTrans را برای کانکشن فراخوانی کنی.
فقط باید در استفاده ازش دقت کنی، طبیعی نیست که مثلا در رویداد OnBeforePost یک دیتاست Transaction درست کنی. اصولا Transaction برای این ساخته میشه که بخوای یک کار چند مرحله ایی را بصورت Atomic انجام بدی، یعنی عملیات فقط زمانی ثب میشه که همه مراحل عملیات موفقیت آمیز باشند، وگرنه اگر فقط یک مرحله از عملیات هم شکست بخوره، کل عملیات Rollback میشه. مثالی که معمولا براش میزنند، مثال حساب بانک هست، فرضا وقتی تو از حساب خودت پول به حساب کس دیگه واریز میکنی، اول پول از حسابت برداشته میشه، بعد به حساب من اضافه میشه، حالا اگر این وسط سیستم از کار بیافته، یا موقع اضافه کردن پول به حساب من، سیستم کرش کنه، پول از حساب تو کم شده، ولی به حساب من اضافه نشده! اینجا هستش که استفاده از Transaction معنی پیدا میکنه.
OnBeforePost برای هر رکوردی که در دیتاست تغییر میکنه، اجرا میشه، تغییری که فقط شامل یک رکورد هست، چه نیازی به Transaction داره؟! باید به این نکته هم دقت کنی که اولا Transaction سربار زیادی داره و برای هر چیزی ازش استفاده نمیشه، برای همین هم باید استفاده ازش محدود باشه، هم در کوتاه ترین زمان ممکن تکلیف Commit یا Rollback شدنش مشخص بشه. اگر به این موارد دقت نکنی، با مشکلات زیادی مواجه میشی، بخصوص اگر حجم فعالیت سرور، یا تعداد کاربران برنامه زیاد باشه، ممکنه با ایرادهای عجیب غریب و وقفه های بی مورد روبرو بشی.

بهتر است توضیح بدی که اصلا چرا می خوای از Transaction استفاده کنی.

قربانت