۱. مقدمه
تراکنش (Transaction) در MySQL مجموعهای از عملیات پایگاه داده است که بهعنوان یک واحد مستقل اجرا میشود. هدف از استفاده از تراکنشها، اطمینان از یکپارچگی و صحت دادهها هنگام اجرای چندین عملیات مرتبط است. یک تراکنش میتواند شامل چندین دستور INSERT
، UPDATE
، DELETE
یا دیگر دستورات SQL باشد که یا بهطور کامل انجام میشوند (COMMIT) یا در صورت بروز خطا، همه تغییرات لغو شده و به حالت اولیه بازمیگردند (ROLLBACK).
۲. ویژگیهای اصلی تراکنشها (ACID)
تراکنشها باید از اصول ACID پیروی کنند:
Atomicity (اتمی بودن):
یا تمام عملیات تراکنش انجام میشوند یا هیچکدام. اگر تراکنش در میانه راه شکست بخورد، تمامی تغییرات به حالت اولیه بازمیگردند.Consistency (یکپارچگی):
پایگاه داده از یک وضعیت معتبر به وضعیت معتبر دیگر منتقل میشود، بدون اینکه قوانین و محدودیتهای داده نقض شوند.Isolation (ایزوله بودن):
اجرای همزمان چند تراکنش نباید باعث ایجاد ناسازگاری در دادهها شود. میزان جداسازی تراکنشها بسته به سطح ایزوله (Isolation Level) متفاوت است.Durability (پایدار بودن):
پس از تأیید تراکنش (COMMIT)، تغییرات بهصورت دائمی در پایگاه داده ذخیره میشوند، حتی در صورت خرابی سیستم.
۳. موتورهای جدول پشتیبانیکننده از تراکنشها
در MySQL، همه موتورهای جدول از تراکنشها پشتیبانی نمیکنند. InnoDB یکی از محبوبترین موتورهای جدولی است که قابلیت تراکنش را دارد.
SHOW ENGINES;
خروجی این دستور نشان میدهد که موتور InnoDB
از تراکنشها پشتیبانی میکند.
۴. نحوه استفاده از تراکنشها در MySQL
در MySQL، تراکنشها معمولاً با استفاده از دستورات START TRANSACTION
، COMMIT
و ROLLBACK
مدیریت میشوند.
۴.۱. آغاز تراکنش (START TRANSACTION
)
برای شروع یک تراکنش از START TRANSACTION
یا BEGIN
استفاده میشود.
START TRANSACTION;
یا:
BEGIN;
۴.۲. اجرای عملیات پایگاه داده
در طول تراکنش، میتوان عملیات INSERT
، UPDATE
یا DELETE
را انجام داد.
INSERT INTO accounts (id, name, balance) VALUES (1, 'Ali', 1000);
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
۴.۳. تأیید و ذخیره تغییرات (COMMIT
)
اگر تمام عملیات موفقیتآمیز باشند، با COMMIT
دادهها بهصورت دائمی ذخیره میشوند.
COMMIT;
۴.۴. لغو تغییرات (ROLLBACK
)
اگر در حین اجرای عملیات مشکلی پیش بیاید و بخواهیم تمام تغییرات را به حالت قبل بازگردانیم، از ROLLBACK
استفاده میکنیم.
ROLLBACK;
۵. مثالهای عملی از تراکنشها در MySQL
۵.۱. مثال: انتقال وجه بین دو حساب بانکی
در این مثال، مبلغی از حساب کاربر A به حساب کاربر B منتقل میشود. اگر در حین تراکنش مشکلی رخ دهد، تمام تغییرات لغو میشوند.
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
COMMIT;
در صورت بروز خطا، تراکنش لغو میشود:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE id = 1;
-- فرض کنید این دستور دچار مشکل شود
UPDATE accounts SET balance = balance + 500 WHERE id = 2;
ROLLBACK;
۶. مدیریت سطح ایزوله (Isolation Levels)
در MySQL، چهار سطح ایزوله برای تراکنشها وجود دارد که رفتار خواندن و نوشتن دادهها را کنترل میکنند.
۶.۱. انواع سطوح ایزوله
سطح ایزوله | توضیحات | مشکل احتمالی |
---|---|---|
READ UNCOMMITTED | یک تراکنش میتواند دادههای تغییریافته ولی هنوز ذخیرهنشده (uncommitted) توسط سایر تراکنشها را بخواند. | Dirty Read |
READ COMMITTED | تراکنش فقط میتواند دادههایی را بخواند که تأیید شدهاند. | Non-repeatable Read |
REPEATABLE READ (پیشفرض در MySQL) | تراکنش دادههای خواندهشده را در طول اجرا قفل میکند، اما ممکن است Phantom Read رخ دهد. | Phantom Read |
SERIALIZABLE | بالاترین سطح ایزوله که از اجرای همزمان تراکنشها جلوگیری میکند و عملکرد را کاهش میدهد. | – |
۶.۲. تنظیم سطح ایزوله در MySQL
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
۷. استفاده از تراکنشها در زبانهای برنامهنویسی
۷.۱. مدیریت تراکنشها در Python با MySQL
در Python میتوان با استفاده از mysql-connector
تراکنشها را مدیریت کرد.
import mysql.connector
# اتصال به پایگاه داده
conn = mysql.connector.connect(
host="localhost",
user="your_user",
password="your_password",
database="your_database"
)
cursor = conn.cursor()
try:
# شروع تراکنش
conn.start_transaction()
# اجرای دستورات SQL
cursor.execute("UPDATE accounts SET balance = balance - 500 WHERE id = 1")
cursor.execute("UPDATE accounts SET balance = balance + 500 WHERE id = 2")
# ذخیره تغییرات
conn.commit()
print("Transaction committed successfully")
except Exception as e:
# لغو تغییرات در صورت خطا
conn.rollback()
print("Transaction rolled back due to error:", e)
finally:
cursor.close()
conn.close()
۸. تفاوت بین AUTOCOMMIT
و TRANSACTION
در MySQL، بهطور پیشفرض AUTOCOMMIT فعال است. یعنی هر دستور SQL بلافاصله اعمال میشود.
۸.۱. غیرفعال کردن AUTOCOMMIT
SET AUTOCOMMIT = 0;
برای فعالسازی مجدد:
SET AUTOCOMMIT = 1;
۹. مزایا و معایب استفاده از تراکنشها
۹.۱. مزایا
✔ حفظ یکپارچگی دادهها
✔ جلوگیری از ایجاد دادههای ناسازگار
✔ امکان لغو تغییرات در صورت بروز خطا
۹.۲. معایب
✖ افزایش مصرف منابع سرور
✖ کاهش عملکرد در برخی موارد
۱۰. نتیجهگیری
تراکنشها در MySQL برای حفظ یکپارچگی و مدیریت دادهها بسیار مهم هستند. با استفاده از دستورات START TRANSACTION، COMMIT و ROLLBACK میتوان از اجرای صحیح عملیات پایگاه داده اطمینان حاصل کرد. همچنین، مدیریت سطوح ایزوله (Isolation Levels) به کنترل رفتار همزمان تراکنشها کمک میکند.
انتخاب صحیح موتور جدول (InnoDB
)، آشنایی با مدیریت AUTOCOMMIT و پیادهسازی تراکنشها در زبانهای برنامهنویسی مانند Python از مهارتهای کلیدی برای کار با پایگاه داده MySQL هستند. 🚀