roleback

پرسیده شده
فعالیت 1404 روز پیش
دیده شده 658 بار
0

سلام استاد شبتون بخیر.امکانش هست درباره تابع roleback توضیح بدید؟عملکردش را بصورت کلی میدونم ولی نحوه اجرا و طرز کار و جزئیات دقیقش را نمیدانم.

فایل پیوست

پویا کاوه
پویا کاوه

7 تیر 99

3
حذف شده

خواهش میکنم 

شما به فرض زمانی که یک سری از دستورات insert رو دارید که باید همگی بطور کامل انجام بشن تا مشکلی توی روند برنامتون به وجود نیاد از تراکنش ها استفاده میکنید

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

مثل تراکنش های بانکی 

فرض کنید قرار از ی حسابی با  شماره 123 یه مبلغی به حساب 456 واریز بشه اینجا شما چند عملیات دارید

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

پس نمیتونیک بگیم که یک قسمت انجام بشه و یک قسمت انجام نشه اشکال نداره باید تمامی عملیات بصورت درست و کامل انجام بشه 

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

 

فایل پیوست

میثم نصرتی

توسط

میثم نصرتی

8 تیر 99

1
حذف شده

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

روش اول: 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

 

فایل پیوست

میثم نصرتی

توسط

میثم نصرتی

7 تیر 99

حذف شده
ممنون از راهنماییتون.توی حالت start transaction باید بعد از commit,rollback هم بکنیم؟در کل کار rollback چه چیزی هست؟
پویا کاوه

8 تیر 99

حذف شده
سلام برای اطلاعات بیشتر داخل این (https://chistio.ir/%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-transaction-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F/) سایت مراجعه کنید
آرش مکینیان

4 آذر 99