آموزش مقدماتی 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 از این خاصیت پشتیبانی نمی کند.

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

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

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

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


تابع IFNULL در MySQL...

MySQL توابع کاربردی بسیاری دارد که یکی از آنها ifnull می باشد. این تابع زمانی که مقدار ورودی(فیلد) null باشد را با مقدار مشخص شده جایگزین می کند......

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

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


دسیمال(Decimal) بهترین تعریف برای داده های پولی و مقداری در MySQL...

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

1 نظر

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

متشکرم

captcha image reload