ورود

View Full Version : سوال: rollback یا abort خودکار ترنزکشن ها؟



eshpilen
شنبه 25 آبان 1392, 07:55 صبح
من اینجا سوال کردم اما کسی جوابی نداد: http://stackoverflow.com/questions/19925341/sql-transactions-automatic-aborts-how-to-detect-and-retry

کسی میدونه دقیقا منظور از این rollback یا abort خودکار ترنزکشن ها چیه و چطور باید در کد آشکارسازی کرد و بعدش چطوری چکار کرد؟

espootin
شنبه 25 آبان 1392, 14:14 عصر
با سلام

Transaction یک عملیاتی است که شامل مجموعه دستوات خواندن و نوشتن می باشد. و وظیفه اصلی آن حفظ یکپارچگی داده و همچنین کنترل خطا ها می باشد.

سه تا از دستوراتی کنترلی Transaction:
1- Commit ذخیره تغییرات
2- Rollback لغو دستورات ، زمانی که خطایی رخ دهد شما می توانید توسط این دستور به حالت اولیه برگردید و تمامی دستورات انجام شده را لغو کنید.
3- Savepoint‌ تعیین نقطه در ترنزاکشن.

یک نمونه از Rollback زدن هنگام بروز خطا :

DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

START TRANSACTION;

-- sql queries

COMMIT;


در کد بالا زمانی که خطایی رخ داد، Rollback‌ زده می شود و خارج می شود.

بنابراین شما توسط Transaction می توانید کنترل مناسبی بروی خطا ها داشته باشید و همچنین یکپارچگی داده ها را نیز حفظ کنید.

eshpilen
دوشنبه 27 آبان 1392, 07:54 صبح
اینا رو که گفتی میدونم.
منظور این نبود.
سوال رو خوب و کامل نخوندی و متوجه نشدی لابد.
من سوالم درمورد نوع خودکار rollback و abort (حالا فرق بین این دوتا چیه باز خودش یه سواله) بود، که در رفرنس MySQL ازش بعنوان یک مشکل یاد میکنه.
میخواستم بدونم دقیقا منظورش چیه و این داستان در چه مواقعی ممکنه پیش بیاد، چطوری باید در کد اون رو آشکارسازی کنیم و وقتی آشکارسازی کردیم بعدش باید چطوری چه کنیم؟ (مثلا retry کنیم یا کار دیگه)

eshpilen
چهارشنبه 29 آبان 1392, 12:44 عصر
جالب اینکه الان برحسب تصادف یه مقاله باز کردم و داشتم میخوندم که به مطلبی برخورد کردم که دیدم شاید همین قضیه ای باشه که در این تاپیک مطرح کردم.


Deadlocks

In some cases, two transactions may, in the course of their processing, attempt to access the same portion of a database at the same time, in a way that prevents them from proceeding. For example, transaction A may access portion X of the database, and transaction B may access portion Y of the database. If, at that point, transaction A then tries to access portion Y of the database while transaction B tries to access portion X, a deadlock occurs, and neither transaction can move forward. Transaction-processing systems are designed to detect these deadlocks when they occur. Typically both transactions will be cancelled and rolled back, and then they will be started again in a different order, automatically, so that the deadlock doesn't occur again. Or sometimes, just one of the deadlocked transactions will be cancelled, rolled back, and automatically restarted after a short delay.

منبع: http://en.wikipedia.org/wiki/Transaction_processing#Deadlocks

ولی شک دارم همین باشه.
بخصوص که در این مطلب نوشته (ظاهرا) که عملیات رفع بن بست و اجرای مجدد ترنزکشن ها رو دیتابیس خودش بصورت خودکار (ظاهرا پشت صحنه) انجام میده. اگر این استنباط درست باشه، این سوال مطرح میشه که پس در سطح برنامه نویس و منطقش چه مشکلی چطوری ممکنه پیش بیاد و بعدش برنامه نویس چطوری میتونه در اون ارتباط کاری کنه؟

eshpilen
چهارشنبه 29 آبان 1392, 18:11 عصر
در مورد deadlock خود دیتابیس این رو مدیریت می کنه و نیازی نیست که برنامه نویسی کاری رو انجام بده. ولی در سطح برنامه نویسی باید تا جای ممکن جلوی deadlock رو گرفت. ولی بنظر نمیاد منظور از اون جملات این قضیه بوده باشه:


... automatic aborts from the server, which is a common problem with transactional database systems.


ترجمه: «... abort های خودکار از طرف سرور، که یک مسئلهء متداول با دیتابیس های ترنزکشنی است.»


... an automatic rollback (which can happen with transactional tables if you are not very careful)


ترجمه: «... یک rollback خودکار (که میتواند با جدول های ترنزکشنی اتفاق بیفتد اگر شما خیلی با دقت نباشید)»

این چیزی که این جملات میگه زیاد با اون قضیهء deadlock جور درنمیاد.
این جملات طوری صحبت کردن که اولا میگه یه مسئلهء متداول است، دوما طوری میگه که انگار برای برنامه نویس دردسرساز میشه، سوما میگه برنامه نویس باید خیلی با دقت باشه تا ازشون اجتناب کنه.
اما این قضیهء deadlock که الان من و شما روش بحث کردیم بنظرم نمیاد اینطورها باشه. اگر زیاد پیش نمیاد و/یا خود دیتابیس بطور خودکار مدیریت و حلش میکنه ، پس دیگه این جملات هشدار دهنده در رفرنس MySQL چه معنی ای دارن؟
بعدم این چیزها رو طوری گفته بعنوان یک مشکل و عیب ترنزکشن ها.
بالاخره باید برای برنامه/برنامه نویس یه مشکلی پیش بیاره که این حرفا رو بزنه یا نه؟ اگر یه چیزی پشت صحنه است گفتنش به این شکل و در اینجا فکر نمیکنم لزومی میداشت.

eshpilen
چهارشنبه 29 آبان 1392, 18:23 عصر
من آدم دقیقی هستم.
همین چندتا جمله توی یک صفحه، باید مو رو از ماست بکشم ببینم دقیقا منظورش چی بوده.
هر جمله ای، کوچکترین اشاره ای، یک جمله بندی خاص، کلمات خاص، کلمه ها و عبارت ها و اصطلاحات خاص، گاهی حتی چیزهای بظاهر بی معنی و تصادفی، میتونن مهم باشن و سرنخی که باید دنبال کرد.
البته متون فنی ای هم که تاحالا خوندم در اکثر موارد نویسنده هم درواقع منظور خاصی داشته و دقیقا نسبت به جمله بندی و چیزهایی که بیان میکرده آگاه بوده. دقیقا لحنی که داشته معنای خاصی داشته.
البته بعضی موارد بی نتیجه و کم ارزش هم بعضا بوده، ولی اکثریت موارد صحیح و مهم بوده.
اکثر چیزهایی مثل اینها رو که پیگیری کردم دیدم بله یک نکته و داستانی در پشتش نهفته است.
بخاطر همین خیلی چیزها رو متوجه شدم و میدونم و میتونم پیشبینی کنم، که خیلی افراد دیگر اینطور نیستن.
پس باید دید منظور چی بوده دقیقا چرا نویسنده این حرفها رو زده دقیقا به چه چیزی اشاره کرده!
در این رشته، البته نه فقط این رشته، بلکه هرچیز پیشرفته و پیچیده و ظریف دیگری، حتی الامکان نباید هیچ چیز نادانسته ای برای آدم باقی بمونه.
البته اگر علاقمند واقعی باشه و بخواد صاحبنظر و پخی بشه در اون زمینه.