PDA

View Full Version : پیاده سازی عملکرد Transaction



حمیدرضاصادقیان
چهارشنبه 03 بهمن 1386, 09:28 صبح
سلام دوستان.من برای اضافه کردن مقادیر در جداولم مراحل زیر رو انجام دادم.
من میخوام دیتاهام در 4 جدول مختلف اضافه بشه و دیتاهای هرکدوم نیز متفاوته.من برای اضافه نمودن در هر جدول یک sp نوشتم. و در داخل برنامه یک procedure نوشتم که تک تک sp ها رو صدا زده و مقادیر رو بهش میدم و در جدول اضافه میشه.تا اینجای کار هیچ مشکلی نیست.
حالا من میخوام مثل transaction عمل کنم.یعنی یا همه دیتاهام وارد جداولم بشه یا اگه وسط کار مشکلی پیش اومد تمامی اونها rollback بشه. یک راهی که خودم به ذهنم رسید اینه که یک sp دیگه تعریف کنم و در داخل بلوک begin tran تمامی این sp ها رو صدا بزنم که یا همش انجام بشه یا هیچکدوم انجام نشه.میخواستم ببینم این روش مشکلی نداره یا شما راه بهتری را پیشنهاد میکنید؟
با تشکر.

JAFO_IRAN
چهارشنبه 03 بهمن 1386, 09:55 صبح
سلام

روش شما که اشکالی نداره ولی حتی در زمان اجرای spها هم میتونید هر 3 را در یک trans اجرا کنید - یعنی مثلا از امکانات transaction موجود در ADOConnection استفاده کنید.

ارادت

حمیدرضاصادقیان
چهارشنبه 03 بهمن 1386, 11:51 صبح
ممنون.من هم دقیقا مد نظرم اینه که یا هر 4 Sp اجرا بشه یا اگر وسط کار سیستم ریست شد تمامی آنها rollback بشه.فکر میکنم باید از trans خود sql استفاده کنم.یعنی تمامی این 4 sp رو داخل یک sp قرار بدم و درون یک Trans اجرا کنم.

vcldeveloper
چهارشنبه 03 بهمن 1386, 16:20 عصر
من هم دقیقا مد نظرم اینه که یا هر 4 Sp اجرا بشه یا اگر وسط کار سیستم ریست شد تمامی آنها rollback بشه.فکر میکنم باید از trans خود sql استفاده کنم.یعنی تمامی این 4 sp رو داخل یک sp قرار بدم و درون یک Trans اجرا کنم.
لازم نیست اون کار را بکنید، همونطور که دوستمون توضیح دادند، می تونید از خود ADOConnection استفاده کنید:


AdoConnection1.BeginTrans;
try
//Run your Stored Procedures here
ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
end;

حمیدرضاصادقیان
پنج شنبه 04 بهمن 1386, 12:33 عصر
ممنون. آقای کشاورز.در این حالت اگر سیستم وسط کار ریست بشه یا من هنگام trace برنامه ، برنامه رو terminate کنم، تمامی اون اعمال به حال خودش برمیگرده؟

vcldeveloper
جمعه 05 بهمن 1386, 00:43 صبح
ممنون. آقای کشاورز.در این حالت اگر سیستم وسط کار ریست بشه یا من هنگام trace برنامه ، برنامه رو terminate کنم، تمامی اون اعمال به حال خودش برمیگرده؟
نمی دونم. این به رفتار SQL Server با Transaction ها مربوط میشه. باید ببینید اگر در حین انجام یک Transaction سیستم ریست بشه، یا Transaction برای مدت طولانی Commit نشه، SQL Server چه رفتاری نشون میده.

حمیدرضاصادقیان
جمعه 05 بهمن 1386, 22:19 عصر
ممنون.پس در اصل این Transaction در خود ado در واقع از خود Transaction ای که در SQL Server وجود داره استفاده میکنه؟ اگر اینطوری باشه پس وقتی که یک transaction ناقص انجام میشه هنگامی که سیستم وسط کار dump میکنه تمامی اعمال باید rollback بشه .حالا این نکته رو من تست میکنم و جوابشو اعلام میکنم.
باتشکر

حمیدرضاصادقیان
یک شنبه 07 بهمن 1386, 16:39 عصر
سلام.من این موارد رو تست کردم.حتی اگر سیستم ریست بشه تمامی اعمال به حالت قبل برخواهد گشت.فقط فکر کنم که کل جداول رو قفل میکنه که باید یک تایمر براش گذاشت که اگر کاربر خیلی درحالت قفل نگه داشت از سیستم شوتش کنیم بیرون.!!

حمیدرضاصادقیان
دوشنبه 22 بهمن 1386, 22:18 عصر
سلام مجدد.من یک مشکلی برخوردم اونم اینه که وقتی در داخل Transaction قرار داره کل سیستم قفل میشه. اینو چکار باید کرد.من به ناچار مجبور شدم بلوک مربوطه رو داخل یک try ..except قرار بدم و هنگامی که خطا رخ داد اطلاعاتی که درج شده رو حذف کنم.
ولی وقتی وسط کار برق بره دیگه راهی نداره.
آیا در Transaction میشه کاری کرد که وقتی یک transaction بازه حداقل کاربران بتونند جداول رو ببیند یا در جداول دیگه ای اطلاعات درج و حذف کنند؟

vcldeveloper
سه شنبه 23 بهمن 1386, 05:05 صبح
سلام مجدد.من یک مشکلی برخوردم اونم اینه که وقتی در داخل Transaction قرار داره کل سیستم قفل میشه.
مگه Transaction رو چطور استفاده می کنید؟! اعمالی که در Transaction انجام میدید باید سریع و کوتاه باشند.


آیا در Transaction میشه کاری کرد که وقتی یک transaction بازه حداقل کاربران بتونند جداول رو ببیند یا در جداول دیگه ای اطلاعات درج و حذف کنند؟
مگه چندتا جدول رو با هم قفل می کنید؟! در Transaction شما می تونید با استفاده از خاصیت IsolationLevel مشخص کنید که دیگران به چه شکلی می تونند داده هایی که Transaction شما داره باهاشون کار میکنه را ببینند. ممکنه یک سرور همه انواع IsolationLevel را پشتیبانی نکنه. باید به مستندات سرور بانکی اطلاعاتی که استفاده می کنید مراجعه کنید و ببینید چه Level هایی را پشتیبانی میکنه و اونی که برای کار شما مناسب هست رو انتخاب کنید.

حمیدرضاصادقیان
سه شنبه 23 بهمن 1386, 07:39 صبح
ممنون آقای کشاورز. من 4 تا عمل اضافه در دیتابیس رو در این transaction قرار دادم. زمان زیادی هم نمی بره. در داخل اون هم 4 تا جدول قفل میشه ولی همین 4 تا جدول جز جداول اصلی من هست. از SQL Server نیز استفاده میکنم.