آموزش مقدماتی Transaction در MySQL - همه برای یکی ، یکی برای همه

۳ سال پیش(به روز شده در ۳ سال پیش) مای اس کیو ال(MySQL) ۱

لوگوی MySQL

لوگوی MySQL

مشخصات تصویر: ۳۸.۳۸ کیلو بایت , ۵۱۲x۵۱۲ پیکسل , png , 14522157584 A67ab2e898 O
جزییات تصویر:
منبع تصویر: اینترنت

بسیاری از برنامه نویسان دوست دارند تا همیشه یک قدم به پیش بروند آنهم سریع و کامل اما همواره همه چیز در یکجا ممکن نیست و نیازمند زمان و آزمون خطاهای متعدد است.

گاها برای شما پیش آمده که چندین کار بصورت پشت سر هم انجام شود اما با شرط: "همه برای یکی ، یکی برای همه". شاید بطور دقیق منظور را متوجه نشدید در واقع مقصود این است که یا همه کارها انجام شود یا هیچکدام انجام نشود. یکی از مهمترین ویژگیهای پایگاه داده تراکنش است. فرض کنید که می خواهید چندین کوئری را پشت سر هم انجام دهید اما مهم است که همه با هم انجام شوند یا هیچکدام انجام نشوند. مثلا هنگام آپلود فایل ، نام و مشخصات فایل در یک جدول و کاربر ثبت کننده در جدول دیگر و حتی دایرکتوری یا پوشه فایل در جدول سوم. خب اگر قرار باشد یکی از کوئری های ثبت با مشکل بر خورد (به هر دلیل) مشکل زاست. چرا که اگر قرار باشد رکورد ثبت مشخصات فایل درج شود ، رکورد کاربر ثبت کننده در جدول مخصوصش ثبت اما رکورد مربوط با دایرکتوری ثبت نشود در هنگام استفاده مشخص نخواهد شد فایل از کدام دایرکتوری است. پس چه بهتر که یا همه بدرستی انجام شوند یا هیچکدام انجام نشوند که یعنی هیچ اتفاقی نیفتاده است و خطایی هم مشخصا وجود ندارد.

تراکنش

ابتدا این مطلب و پردازش تراکنش را در ویکیپدیا بخوانید. ما قصد توضیح تئوریک کارکرد یا ویژگی های تراکنش را نداریم. بلکه مقصود این است که چطور از آن در برنامه نویسی استفاده کنیم. در اینجا تمامی بحث بر روی پایگاه داده MySQL است. دو حالت برای فعالسازی یا استفاده از این خاصیت ممکن است ابتدا راه اول را پیش میگیریم.

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

نتیجه:

A B

در کد بالا چون دستور 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

توجه: حتما در هنگام ایجاد جدول از موتور ذخیره سازی InnoDB یا سایر که از خاصیت تراکنش پشتیبانی می کنند استفاده کنید. چرا که موتور MyISAM از این خاصیت پشتیبانی نمی کند.

و در آخر پیشنهاد میکنیم جهت آموزش بهتر حتما بصورت عملی کوئری ها را اجرا کنید.

صفحات پیشنهادی

گرفتن آخرین شناسه رکورد جدید بعد از درج رکورد...

در MySQL بسیار پیش می آید که بعد از درج رکورد ، شناسه رکورد جدید را بدست آوریم. برای این منظور کافیست بعد از درج کوئری زیر را اجرا کنید. البته توجه نمایید که برای بدست آوردن شناسه حتما باید در جدول کل...

گرفتن آخرین شناسه ثبت شده در MySQL بعد از دستور INSERT...

بسیار برای برنامه نویسان پیش آمده که بعد از دستور INSERT شناسه ثبت شده را بدست آورند. شناسه ای که بصورت خودکار یک واحد اضافه می شود و کلید اصلی است. برای این منظور راه های بسیاری پیشنهاد شده اما چون ا...


مثال تصویری برخی از دستورات مهم MySQL...

در این مقاله , تصاویر مختلفی در رابطه با برخی از دستورات مهم MySQL ضمیمه گردیده اند که درک آنها را بسیار راحت تر می کند پیشنهاد می کنیم در صورت تمایل آنها را نزد خود داشته باشید تا در صورت فراموشی به ...

اجرای دستور UPDATE در MySQL به صورت تابع در PHP...

تابع زیر اجرای دستور UPDATE در پایگاه داده مای اس کیو ال را ساده تر می کند کافیست نام جدول , فیلدها(به صورت آرایه) و در نهایت شرط مورد نظر را در ورودی تابع مشخص سازید تا تابع کوئری مورد نظر را ایجاد ک...

1 نظر

gravatar  امین
۳ سال پیش - بررسی شده - نوشته شده توسط مهمان

متشکرم

captcha image reload