نحوه استفاده از تراکنش های MySQL

تراکنش پایگاه داده چیست و چرا مهم است؟
تراکنش پایگاه داده یک ناحیه واحد از پایگاه داده است که در آن چندین عملیات داده انجام شده و به طور کلی نوشته می شود.
این عملیات می تواند ایجاد، خواندن، به روز رسانی یا حذف عملیات باشد.
در طول فرآیند یک تراکنش، پایگاه داده در وضعیت ناسازگاری قرار دارد زیرا عملیاتهایی در حال انجام هستند که در حال ایجاد تغییرات در پایگاه داده هستند. هنگامی که عملیات انجام شد، DB به حالت سازگارتر باز می گردد.
برای موفقیت آمیز بودن یک تراکنش، به این معنی است که هر عملیات انجام شده متعهد شده است.
تراکنش های پایگاه داده در حصول اطمینان از سازگاری پایگاه داده شما زمانی که چندین عملیات همزمان انجام می شود بسیار مهم است. همچنین راهی برای بازیابی تغییراتی که ممکن است به دلیل شکست یا سوء استفاده تصادفی از یک عملیات رخ داده باشد در اختیار شما قرار می دهد.
مروری بر MySQL و پشتیبانی تراکنش های آن
پایگاه های داده MySQL با ارائه دستوراتی برای شروع این تراکنش ها، از تراکنش های پایگاه داده پشتیبانی می کنند. پرس و جوهای داخلی زیر را به ما می دهد:
" START TRANSACTION / BEGIN ": این پرس و جو شروع یک تراکنش را آغاز می کند.
" COMMIT ": این پرس و جو اجازه می دهد تا تغییرات ایجاد شده در پایگاه داده دائمی شود. با استفاده از پرس و جوی زیر می توانید پایگاه داده خود را به صورت خودکار تنظیم کنید:
SET autocommit = 1;
" SET ": این پرس و جو به شما اجازه می دهد تا با فعال کردن عملیات برای انجام خودکار یا غیرفعال کردن commit خودکار، commit خود را تنظیم کنید. یعنی تا زمانی که پرس و جوی "commit" را فراخوانی نکنید، عملیات شما به طور خودکار انجام نمی شود.
دیگر اخبار
آن را روی هم جمع کنید! ULA اولین موشک Vulcan Centaur را قبل از پرتاب اولیه مونتاژ کرد (عکس)
/*Disabling the auto-commit */ SET autocommit = 0; /* OR */ SET autocommit = OFF; /* Enabling the operations to automatically commit every operation*/ SET autocommit = 1; /* OR */ SET autocommit = ON
" ROLLBACK ": این پرس و جو به شما اجازه می دهد تا تغییراتی را که در پایگاه داده ایجاد کرده اید لغو کنید، بنابراین پایگاه داده را به حالت قبلی (آخرین تعهد) بازگردانید.
ACID ویژگی های معاملات
ACID مخفف کلمات Atomicity، Consistency، Isolation و Durability است. بیایید هر اصطلاح را مرور کنیم تا بفهمیم آنها چگونه با معاملات ارتباط دارند.

اتمی
اتمی بودن در یک تراکنش پایگاه داده به این معنی است که تمام تغییرات ایجاد شده در طول آن تراکنش به عنوان یک "بسته" تغییرات در نظر گرفته می شود. این بدان معناست که وقتی میخواهید پایگاه داده خود را تغییر دهید، یا همه تغییرات در یک زمان اتفاق میافتند یا اصلاً هیچکدام از آنها اتفاق نمیافتد.
مثل زمانی است که شما و هم تیمی هایتان در حال ساختن یک اپلیکیشن هستید. اگر یک نفر یک خط کد بنویسد و سپس شخص دیگری آن را حذف کند، مثل این است که هیچ اتفاقی نیفتاده است. اما اگر همه به اضافه کردن خطوط مختلف کد ادامه دهند و هیچ کس آن را حذف نکند، آنگاه پایه کد بزرگتر می شود.
ثبات
سازگاری در پایگاه های داده به این معنی است که داده های ذخیره شده در پایگاه داده همیشه در وضعیت معتبر و سازگار هستند. به عنوان مثال، اگر پایگاه داده حاوی هر گونه محدودیتی مانند کلیدهای اصلی، کلیدهای خارجی و غیره باشد، باید همیشه با قوانین پیرامون محدودیت مطابقت داشته باشد.
به عنوان مثال، فرض کنید یک جدول دارای یک قانون است که می گوید یک ستون خاص باید یک مقدار صحیح باشد. سازگاری تضمین می کند که این قانون همیشه رعایت می شود و داده های درج شده در ستون فقط می توانند از نوع داده های مقدار صحیح باشند.
انزوا
توانایی چندین تراکنش برای اجرای بدون تداخل با یکدیگر به عنوان Isolation شناخته می شود. سطح جداسازی یک تراکنش تعیین می کند که چگونه تغییرات ایجاد شده توسط آن تراکنش برای سایر تراکنش ها قابل مشاهده است.
MYSQL از سطوح جداسازی زیر پشتیبانی می کند:
من. READ UNCOMMITTED : در سطح READ UNCOMMITTED که پایینترین سطح جداسازی نیز هست، یک تراکنش میتواند دادههایی را بخواند که هنوز توسط سایر تراکنشها انجام نشده است. این بدان معناست که سایر تراکنشها میتوانند دادههایی را که تراکنش دیگری در حال حاضر میخواند تغییر دهند، اما این تغییرات ممکن است تا زمانی که عملیات کامل نشده باشد قابل مشاهده نباشند.
ii READ COMMITTED : این دومین به پایین ترین سطح ایزوله است. در اینجا، یک تراکنش فقط قادر به خواندن داده هایی است که قبلاً توسط تراکنش های دیگر انجام شده است. این بدان معناست که سایر تراکنشها میتوانند دادههایی را که یک تراکنش در حال خواندن است تغییر دهند، اما این تغییرات تا زمانی که تراکنش دیگر انجام نشود قابل مشاهده نخواهد بود.
III. REPEATABLE READ : این سطح بالاتری از انزوا است. تراکنش در این سطح فقط قادر به خواندن داده هایی است که قبلاً توسط تراکنش های دیگر متعهد شده اند، و همچنین تراکنش های دیگر را از تغییر داده هایی که در حال حاضر خوانده می شود محدود می کند. این بدان معنی است که حتی اگر تراکنش های دیگر تغییراتی را انجام داده باشند، اگر یک تراکنش دوباره یک دستور SELECT را اجرا کند، همیشه همان داده ها را مشاهده می کند.
IV SRIALIZable : این بالاترین سطح ایزوله است. در این سطح، یک تراکنش تنها قادر به خواندن داده هایی است که قبلاً توسط تراکنش های دیگر انجام شده است. همچنین از تغییر دادههایی که تراکنش میخواند و ردیفهای جدیدی که برای تراکنش فعلی قابل مشاهده است، دیگر تراکنشها را تغییر نمیدهد.
MySQL به طور پیش فرض از سطح جداسازی READ COMMITTED استفاده می کند. با این حال، با استفاده از عبارت "SET TRANSACTION IOLATION LEVEL" می توان سطح ایزوله را تغییر داد.
ماندگاری
دوام تضمین می کند که داده های شما حتی در شرایط پیش بینی نشده ایمن باقی می مانند. هنگامی که یک تراکنش انجام می شود، تغییرات آن باید در پایگاه داده باقی بماند، حتی اگر دچار نقص یا قطع برق شود.
اما MySQL چگونه دوام را تضمین می کند؟ از ثبت پیشنویس استفاده میکند. این تکنیک شامل نوشتن گزارش تراکنش بر روی دیسک قبل از ایجاد هر گونه تغییر در پایگاه داده است.
گزارش به عنوان یک نقشه راه برای پایگاه داده عمل می کند و حاوی اطلاعاتی در مورد تغییراتی است که در صورت خرابی غیرمنتظره سیستم ایجاد می شود. در این صورت، پایگاه داده را می توان از لاگ بازیابی کرد و تغییرات ایجاد شده در تراکنش مجدداً پخش می شود تا اطمینان حاصل شود که پایگاه داده هنوز در وضعیت ثابتی قرار دارد.
مهم است که به خاطر داشته باشید که اگرچه ثبت پیشنویس میتواند تأثیری بر عملکرد داشته باشد، هزینه کمی برای آرامش خاطری است که با اطلاع از ایمن بودن دادههای شما حاصل میشود.
قفل و همزمانی در تراکنش های MySQL
قفل کردن تکنیکی است که برای جلوگیری از شرایط مسابقه استفاده می شود. شرط مسابقه فرآیندی است که در آن چندین تراکنش در تلاش برای دسترسی به داده های مشابه در یک زمان هستند.
MySQL از انواع مختلفی از قفل ها برای کنترل دسترسی به داده ها در یک تراکنش استفاده می کند. این شامل:
قفل های مشترک : این امکان را به چندین تراکنش می دهد تا داده های یکسانی را به طور همزمان بخوانند، اما هر یک از آنها را از نوشتن یا ایجاد تغییرات در آن محدود می کند.
قفل های انحصاری : این کار از خواندن یا نوشتن همزمان داده های مشابه توسط تراکنش های مختلف جلوگیری می کند.
قفلهای هدف : برای مشخص کردن اینکه یک تراکنش در حال برنامهریزی برای خواندن یا نوشتن بخش خاصی از داده است استفاده میشود.
قفلهای سطح ردیف : این به تراکنشها اجازه میدهد فقط ردیفهای خاصی را که باید به آن دسترسی داشته باشند قفل کنند، نه کل جدول.
همزمانی روشی است که در آن چندین تراکنش می توانند به طور همزمان بدون تداخل با داده های یکدیگر اجرا شوند.
MySQL از مکانیزم کنترل همزمانی چند نسخه (MVCC) استفاده می کند. این اجازه می دهد تا چندین تراکنش به طور همزمان بدون تداخل روی یک داده بخوانند و بنویسند.
من مطمئن هستم که شما تعجب می کنید که چگونه می توان به این امر دست یافت. خوب، هر نوع تراکنش دادههایی را که قرار است در شروع تراکنش تغییر دهد جمعآوری میکند و تغییرات خود را در یک نسخه کاملاً متفاوت از دادهها مینویسد. این به سایر تراکنش ها اجازه می دهد تا بدون تضاد منافع به کار با نسخه اصلی داده ها ادامه دهند.
برای دستیابی به همزمانی بالا، مهم است که تراکنشها را تا حد امکان کوتاه نگه دارید و از تراکنشهای طولانیمدت که برای مدتهای طولانی قفل نگه میدارند اجتناب کنید.
نحوه ایجاد و استفاده از تراکنش ها در MySQL
اولین چیزی که لازم است شروع تراکنش با استفاده از عبارت "START TRANSACTION" است. به عنوان مثال:
START TRANSACTION; INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]'); UPDATE accounts SET balance = SUM(balance) WHERE name = 'John Doe';
در این مثال، یک تراکنش جدید با عبارت START TRANSACTION آغاز می شود. دو عبارت بعدی، یک درج و یک به روز رسانی، در تراکنش اجرا می شوند.
گام بعدی این است که تغییرات را انجام دهید تا مطمئن شوید که دائمی هستند. ما این کار را با قرار دادن عبارت COMMIT در پرس و جو انجام می دهیم.
START TRANSACTION; INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]'); UPDATE accounts SET balance = SUM(balance) WHERE name = 'John Doe'; COMMIT;
اگر به احتمال زیاد در حین تراکنش خطایی رخ داد و می خواهید تغییرات را لغو کنید، می توانید از عبارت ROLLBACK استفاده کنید. سپس تراکنش به عقب برگردانده می شود و دستورهای درج و به روز رسانی اجرا نمی شوند. این بدان معناست که هیچ تغییری در پایگاه داده رخ نخواهد داد.
START TRANSACTION; INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]'); UPDATE accounts SET balance = SUM(balance) WHERE user_id=15; ROLLBACK;
نحوه استفاده از موتور ذخیره سازی InnoDB برای تراکنش ها
InnoDB یک موتور ذخیره سازی برای MySQL است که عملکردهای زیادی دارد که می تواند عملکرد پایگاه داده شما را بهبود بخشد. برخی از این ویژگیها عبارتند از توانایی گروهبندی و اجرای چندین دستور SQL با هم، رمزگذاری دادههای ما، ایجاد و رها کردن فهرستها بدون تأثیر بر عملکرد پایگاه داده، مدیریت CPU و همچنین دادههای بزرگ و بسیاری موارد دیگر.
برای استفاده از InnoDB برای تراکنش ها در MySQL، باید مطمئن شوید که جداول شما از موتور ذخیره سازی InnoDB استفاده می کنند. با اجرای پرس و جو زیر می توانید این موضوع را بررسی کنید:
SHOW TABLE STATUS FROM your_database_name;
این به شما موتور ذخیره سازی استفاده شده توسط هر جدول در پایگاه داده شما را نشان می دهد. همچنین میتوانید با تغییر فایل پیکربندی my.cnf
یا اجرای دستور زیر، موتور ذخیرهسازی پیشفرض را روی InnoDB تنظیم کنید:
SET storage_engine=InnoDB;
پس از اجرای این کوئری، جداول پایگاه داده شما باید از موتور ذخیره سازی InnoDB استفاده کنند. سپس میتوانیم عملکردهایی را که در بالا ذکر کردیم، انجام دهیم.
START TRANSACTION; UPDATE accounts SET balance = 50 WHERE user_id = 1; UPDATE accounts SET balance = 2000 WHERE user_id = 2; COMMIT;
این یک مثال ساده از تراکنش است که دو ردیف را در جدول "حساب ها" به روز می کند. اگر هر یک از عبارات ناموفق باشد، کل تراکنش برگردانده می شود و هیچ تغییری در پایگاه داده ایجاد نخواهد شد.
علاوه بر این، InnoDB همچنین برخی از ویژگیهای اضافی مانند قفل کردن در سطح ردیف، محدودیتهای کلید خارجی و بازیابی خرابی را فراهم میکند که آن را قویتر و قابل اعتمادتر از سایر موتورهای ذخیرهسازی، بهویژه برای بارهای کاری تراکنشی میکند.
نحوه رسیدگی به خطاها و استثنائات در معاملات
رسیدگی به خطاها و استثناها به ویژه هنگام کار با تراکنش ها مهم است.
یک روش مدیریت خطاها و استثناها در تراکنش ها استفاده از بلوک try-catch است. در MySQL، می توانید از دستورات SIGNAL و RESIGNAL برای بالا بردن و رسیدگی به استثناها در یک تراکنش استفاده کنید.
در اینجا مثالی از نحوه استفاده از بلوک try-catch برای مدیریت یک استثنا در یک تراکنش آورده شده است:
START TRANSACTION; DECLARE EXIT HANDLER FOR SQLEXCEPTION START TRANSACTION ROLLBACK; RESIGNAL; END; UPDATE accounts SET balance = 5000 WHERE user_id = 1; UPDATE accounts SET balance = 1000 WHERE user_id = 2; IF (SELECT balance FROM accounts WHERE user_id = 1) < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient balance'; END IF; COMMIT;
بلوک DECLARE EXIT HANDLER FOR SQLEXCEPTION برای گرفتن هرگونه استثناء SQL که در تراکنش رخ می دهد استفاده می شود.
اگر یک استثنا گرفته شود، تراکنش با استفاده از عبارت ROLLBACK برگشت داده می شود. سپس عبارت RESIGNAL استثنا را دوباره مطرح میکند تا در صورت وجود، بتوان آن را توسط یک بلوک بیرونی try-catch مدیریت کرد.
دستور IF بررسی می کند که آیا موجودی user_id = 1 کمتر از صفر است یا خیر. اگر درست باشد، عبارت SIGNAL یک استثنا با یک SQLSTATE خاص '45000' و یک پیام "تعادل ناکافی" ایجاد می کند.
شایان ذکر است که اگر یک استثنا در یک تراکنش رخ دهد، هر تغییری که ممکن است در طول تراکنش رخ داده باشد، صرف نظر از اینکه آیا استثنا مورد بررسی قرار میگیرد یا خیر، بازگردانده میشود.
نحوه استفاده از Savepoints در تراکنش های MySQL
استفاده از عبارت SAVEPOINT در یک تراکنش برای تنظیم نقاط ذخیره، تمرین خوبی است. این امکان را برای شما فراهم می کند تا به جای بازگرداندن کل تراکنش، به نقطه خاصی از تراکنش برگردید.
در اینجا مثالی از نحوه استفاده از عبارت SAVEPOINT در مثال قبلی آورده شده است:
START TRANSACTION; DECLARE EXIT HANDLER FOR SQLEXCEPTION START TRANSACTION ROLLBACK TO SAVEPOINT my_savepoint; RESIGNAL; END; UPDATE accounts SET balance = 5000 WHERE user_id = 1; UPDATE accounts SET balance = 1000 WHERE user_id = 2; IF (SELECT balance FROM accounts WHERE user_id = 1) < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insufficient balance'; END IF; COMMIT;
شما از عبارت SAVEPOINT برای تنظیم یک ذخیره با نام "my_savepoint" قبل از دو به روز رسانی استفاده می کنید. اگر یک استثنا گرفته شود، دستور ROLLBACK به جای بازگرداندن کل تراکنش، تراکنش را با استفاده از عبارت "TO SAVEPOINT my_savepoint" به ذخیره برمی گرداند.
با این کار فقط تغییرات ایجاد شده پس از ذخیرهپوینت لغو میشود و تغییرات انجامشده قبل از ذخیرهپوینت دستنخورده باقی میماند.
نتیجه
عملیات تراکنش بسیار مهم است. آنها به توسعه دهندگان کمک می کنند تا اطمینان حاصل کنند که پایگاه داده آنها در یک وضعیت ثابت باقی می ماند و در صورت لزوم، تغییر تغییرات را آسان می کند.
MySQL ویژگی هایی مانند commit، rollback و savepoint را برای آسان تر کردن فرآیند ارائه می دهد. همچنین موتورهای قوی مانند InnoDB را ارائه می دهد که از این ویژگی ها نیز پشتیبانی می کنند.
برای اطلاعات بیشتر در مورد تراکنش های MySQL، می توانید اسناد رسمی را بررسی کنید.
ارسال نظر