سلام استاد شبتون بخیر.امکانش هست درباره تابع roleback توضیح بدید؟عملکردش را بصورت کلی میدونم ولی نحوه اجرا و طرز کار و جزئیات دقیقش را نمیدانم.
سلام این متن شاید بتونه کمکت کنه
روش اول: AUTOCOMMIT
در حالت پیشفرض ، پایگاه داده MySQL هر کوئری که درخواست شود را اجرا و نتایجش را ثبت میکند(یعنی autocommit = 1). اگر شما چند کوئری اجرا کنید که اگر یکی از آنها به مشکل بر خورد دیگر کوئریها بر خلاف خاصیت تراکنش(چون هنوز فعال یا درخواست نکرده ایم) ، نتایجشان ثبت میشود. حال اگر خاصیت autocommit را به صفر برگردانیم تا زمانی که از دستور COMMIT استفاده نکنیم نتایج کوئریها ثبت نخواهد شد(منظور در حالت درج ، ویرایش یا حذف). بعنوان مثال:
SET autocommit=0;
INSERT INTO table1...;
INSERT INTO table2...;
INSERT INTO table3...;
COMMIT;
نتیجه:
A B
x1 y1
x2 y2
x3 y3
در کد بالا اگر دستور COMMIT استفاده نمیشد هیچ درجی صورت نمیگرفت. حال اگر بخواهیم که INSERTها رو غیرفعال کنیم از دستور ROLLBACK استفاده میکنیم. مثال:
SET autocommit=0;
INSERT INTO table1...;
INSERT INTO table2...;
INSERT INTO table3...;
ROLLBACK;
در کد بالا چون دستور ROLLBACK استفاده شده است مانند این است که کلیه کوئریهای قبل برگشت خورده است و گویی هیچ کوئری اجرا نشده است.
نکته اول: اگر مقدار autocommit را به صفر تغییر دادید ، باید به ازای هر کوئری از دستور COMMIT یا ROLLBACK استفاده کنید تا نتایج ذخیره شوند وگرنه این خاصیت درج غیر خودکار تا بسته شدن ارتباط یا Connection با MySQL ادامه دارد. مثال:
SET autocommit=0;
INSERT INTO table1...;
ROLLBACK;
INSERT INTO table1...;
INSERT INTO table1...;
COMMIT;
نکته دوم: هر زمان که بخواهید میتوانید مقدار autocommit را به 1 برگردانید تا به حالت معمولی برگردد. یعنی:
SET autocommit=0;
INSERT INTO table1...;
ROLLBACK;
INSERT INTO table1...;
INSERT INTO table1...;
COMMIT;
SET autocommit=1;
INSERT INTO table1...;
INSERT INTO table1...;
INSERT INTO table1...;
روش دوم: START TRANSACTION
عملکرد این روش دقیقا مشابه روش قبل است اما با این تفاوت که با هر بار اجرای COMMIT یا ROLLBACK تراکنش خاتمه پیدا میکند و باید برای تراکنش جدید از یک START TRANSACTION جدید استفاده کنید مثال:
START TRANSACTION;
INSERT INTO table1...;
INSERT INTO table1...;
COMMIT;
START TRANSACTION;
INSERT INTO table1...;
INSERT INTO table1...;
ROLLBACK;
نتیجه:
A B
x1 y1
x2 y2
میثم۰۷ تیر ۱۳۹۹، ۲۳:۱۸
خواهش میکنم
شما به فرض زمانی که یک سری از دستورات insert رو دارید که باید همگی بطور کامل انجام بشن تا مشکلی توی روند برنامتون به وجود نیاد از تراکنشها استفاده میکنید
حالا فکر کنید یک قسمت از اون دستورات اجرا شده و قسمت دیگه ای از دستورات حالا به هر دلیل (مشکل سرور، مشکل کد، قطع برق و...) اجرا نشن و داخل دیتابیس ثبت نشن اما شما نیاز دارید تمامی عملیات بصورت کامل انجام بشه
مثل تراکنشهای بانکی
فرض کنید قرار از ی حسابی با شماره 123 یه مبلغی به حساب 456 واریز بشه اینجا شما چند عملیات دارید
باید از حساب شماره 123 پول کم بشه بعد به حساب 456 اضافه بشه خوب حالا فک کنید که این وسط قبل از اینکه پول به حساب 456 واریز بشه سرور دچار مشکل بشه شما اگه از تراکنشهای پایگاه داده بهره نگیرید اون پول از حساب 123 خارج شده عملیات برای حساب 123 انجام شده اما به حساب 456 اضافه نشده این وسط اون مبلغ گم میشه
پس نمیتونیک بگیم که یک قسمت انجام بشه و یک قسمت انجام نشه اشکال نداره باید تمامی عملیات بصورت درست و کامل انجام بشه
اگه این اتفاق افتاد و وسط انتقال سرور قطع شد باید ی راهی باشه بعد از راه اندازی دوباره سرور این عملیات از نو تکرار شه و rollback برای اینه که عملیات رو دوباره از اول انجام بده انگار اتفاقی نیفتاده.