تراکنش ها (Transactions) در MySQL — راهنمای جامع

۴۱۹ بازدید
آخرین به‌روزرسانی: ۲۶ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
تراکنش ها (Transactions) در MySQL — راهنمای جامع

یک «تراکنش» (transaction)، گروهی متوالی از عملیات دستکاری پایگاه داده است که به صورت یک واحد کاری مجزا اجرا می‌شود. به بیان دیگر، یک تراکنش هرگز کامل نمی‌شود؛ مگر اینکه هر یک از اعمال درون گروه موفقیت‌آمیز باشند. اگر هر یک از اعمال درون تراکنش با شکست مواجه شوند، کل تراکنش شکست می‌خورد.

خصوصیات تراکنش

تراکنش‌ها دارای چهار خصوصیت استاندارد هستند که معمولاً ACID نامیده می‌شوند. این موارد در ادامه بیان شده‌اند.

  • Atomicity – این خصوصیت تضمین می‌کند که همه عملیات درون واحد کاری به طور موفقیت‌آمیزی کامل شده‌اند؛ در غیر این صورت، تراکنش در نقطه شکست متوقف می‌شود و عملیات قبلی به وضعیت‌های (States) پیشین خود باز می‌گردند.
  • Consistency – این خصوصیت تضمین می‌کند که پایگاه داده بر اساس اجرای موفقیت‌آمیز یک تراکنش، وضعیت‌ها را به طور مناسبی تغییر می‌دهد.
  • Isolation – این خصوصیت تراکنش‌ها را قادر می‌سازد تا به طور مستقل از هم عمل کنند و برای یکدیگر شفاف باشند. به عبارت دیگر عملکرد هر تراکنش برای دیگر تراکنش‌ها شفاف است؛ اما این امر مانع استقلال آن‌ها از یکدیگر نمی‌شود.
  • Durability – این خصوصیت تضمین می‌کند که نتیجه یا تأثیر یک تراکنش اجرا شده، در صورت از کار افتادن سیستم به قوت خود باقی می‌ماند.

در MySQL، تراکنش‌ها با عبارت «BEGIN WORK» آغاز و با عبارت «COMMIT» یا «ROLLBACK» پایان می‌یابند. دستورهای SQL قرار گرفته بین این عبارت‌های آغاز و پایان بخش عمده تراکنش‌ها را تشکیل می‌دهند.

COMMIT و ROLLBACK

این دو کلیدواژه به طور عمده برای تراکنش‌های MySQL مورد استفاده قرار می‌گیرند.

  • وقتی یک تراکنش موفق کامل می‌شود، دستور COMMIT باید صادر شود تا تغییرات صورت گرفته روی همه جدول‌های درگیر اعمال شوند.
  • اگر شکستی به وقوع بپیوندد، باید یک دستور ROLLBACK صادر شود تا کلیه جدول‌هایی که تراکنش به آن‌ها ارجاع داشته، به وضعیت قبل خود بازگردند.

رفتار یک تراکنش را می‌توان با تنظیم متغیر نشست (Session) که AUTOCOMMIT نامیده می‌شود، کنترل کرد. اگر AUTOCOMMIT روی ۱ تنظیم شده باشد (یعنی مقدار پیش‌فرض)، هر عبارت SQL (چه درون تراکنش باشد و چه نباشد) به عنوان یک تراکنش کامل در نظر گرفته می‌شود و به طور پیش‌فرض پس از پایان یافتن COMMIT می‌شود.

زمانی که AUTOCOMMIT روی مقدار 0 تنظیم شده باشد، با صادر کردن دستور SET AUTOCOMMIT = 0، سری‌های بعدی عبارت‌ها مانند یک تراکنش عمل می‌کنند و تا زمانی که یک دستور صریح COMMIT صادر نشود، هیچ فعالیتی به Commit نمی‌شود. این دستورهای SQL را می‌توان در PHP با استفاده از تابع ()mysql_query اجرا کرد.

یک مثال کلی از تراکنش

توالی زیر از رویدادها، مستقل از زبان برنامه‌نویسی مورد استفاده است. مسیر منطقی را می‌توان با هر زبانی که برای ساخت «برنامه کاربردی» (application) مورد استفاده قرار می‌گیرد ایجاد کرد.

این دستورات SQL را  می‌توان با استفاده از تابع ()mysql_query در زبان برنامه‌نویسی «پی‌اچ‌پی» (PHP) اجرا کرد.

  • آغاز تراکنش با صادر کردن دستور SQL که در ادامه آمده: BEGIN WORK
  • صادر کردن یکی یا تعداد بیشتری از دستورهای SQL مانند SELECT, INSERT, UPDATE یا DELETE.
  • بررسی اینکه خطایی وجود نداشته باشد و همه چیز مطابق با خواست کاربر (برنامه‌نویس) پیش برود.
  • اگر خطایی وجود داشته باشد، باید یک دستور ROLLBACK و در غیر این صورت یک دستور COMMIT صادر شود.

انواع جدول تراکنش-امن در MySQL

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

پشتیبانی از جدول‌های InnoDB نیازمند نوع خاصی از پارامترهای کامپایل هنگام کامپایل کردن MySQL از کد منبع است. اگر نسخه MySQL کاربر از InnoDB پشتیبانی نمی‌کند، نیاز به نصب نسخه‌ای است که از این نوع جدول پشتیبانی کند. در صورتی که نسخه MySQL کاربر از InnoDB پشتیبانی می‌کند، کافی است در دستور ایجاد جدول از عبارت TYPE = InnoDB استفاده کند. برای نمونه کد زیر یک جدول InnoDB به نام tcount_tbl ایجاد می‌کند:

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.05 sec)

برای دریافت جزییات بیشتر در خصوص InnoDB می‌توان به صفحه (+) مراجعه کرد. همچنین، می‌توان انواع دیگری از جدول‌ها مانند GEMINI یا BDB را نیز مورد استفاده قرار داد؛ اما این امر بستگی دارد به اینکه نسخه نصب شده توسط کاربر از آن‌ها پشتیبانی می‌کند یا خیر.

اگر این مطلب برایتان مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
tutorialspoint
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *