خانه/ تراکنش‌ها/ تراکنش‌ها

تراکنش: گروهی از دستورها که یا همه اجرا می‌شوند، یا هیچ‌کدام

مبتدی ۱۳ دقیقه مطالعه

فرض کن می‌خواهی ۱۰۰٬۰۰۰ تومان از حساب علی به حساب زهرا منتقل کنی. این کار دو دستور جدا نیاز دارد: کم‌کردن از حساب علی، و اضافه‌کردن به حساب زهرا. اگر دستور اول اجرا شود اما درست وسط راه (مثلاً به‌خاطر قطعی برق یا خرابی شبکه) دستور دوم هرگز اجرا نشود، پول علی کم شده اما به حساب زهرا نرسیده — پول به‌طور واقعی «گم» شده است. تراکنش (Transaction) دقیقاً همین مشکل را حل می‌کند.

ساختار پایه: BEGIN، COMMIT و ROLLBACK

sql
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100000 WHERE id = 1;
UPDATE accounts SET balance = balance + 100000 WHERE id = 2;

COMMIT;

BEGIN TRANSACTION شروع یک بلوک تراکنشی را اعلام می‌کند؛ از این لحظه، تغییرات فقط به‌صورت موقت و «آزمایشی» اعمال می‌شوند. COMMIT همه‌ی این تغییرات را برای همیشه قطعی می‌کند. بیا این را روی دو حساب واقعی امتحان کنیم:

امتحانش کن — تراکنش با COMMIT
هر دو تغییر با هم قطعی شدند: علی=۴۰۰٬۰۰۰ و زهرا=۳۰۰٬۰۰۰. جمع کل پول (۷۰۰٬۰۰۰) دقیقاً همان قبل مانده — هیچ پولی گم یا اضافه نشده.

ROLLBACK — پشیمان شدن از یک تراکنش

اگر پیش از COMMIT متوجه اشتباهی شوی (یا برنامه خطا بدهد)، ROLLBACK همه‌ی تغییرات آن تراکنش را کاملاً به حالت قبل برمی‌گرداند — انگار هیچ‌وقت اتفاق نیفتاده:

sql
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100000 WHERE id = 1;
UPDATE accounts SET balance = balance + 100000 WHERE id = 2;
ROLLBACK;

بیا امتحان کنیم:

امتحانش کن — تراکنش با ROLLBACK
با این‌که دقیقاً همان دو UPDATE اجرا شد، چون به‌جای COMMIT، ROLLBACK زدیم، هر دو حساب دقیقاً به مقدار اولشان (۵۰۰٬۰۰۰ و ۲۰۰٬۰۰۰) برگشتند — انگار این دو خط هرگز اجرا نشده‌اند.

در SQL Server: نام کمی متفاوت

SQLite (این Playground) از BEGIN TRANSACTION پشتیبانی می‌کند؛ در SQL Server معمولاً کوتاه‌ترش می‌نویسند:

sql
BEGIN TRAN; -- مخفف BEGIN TRANSACTION، رایج در SQL Server

جمع‌بندی این درس

  • تراکنش، گروهی از دستورها را به یک واحد منطقی تبدیل می‌کند: یا همه اجرا می‌شوند، یا هیچ‌کدام.
  • COMMIT تغییرات را برای همیشه قطعی می‌کند.
  • ROLLBACK همه‌ی تغییرات تراکنش را کاملاً لغو می‌کند.
  • مثال کلاسیک: انتقال وجه بین دو حساب — بدون تراکنش، پول می‌تواند در میانه‌ی راه «گم» شود.

در درس بعدی، سراغ چهار اصل معروف ACID می‌رویم که رفتار درست هر تراکنش را تضمین می‌کنند — و یک نکته‌ی مهم و غافلگیرکننده درباره‌ی این‌که atomicity همیشه هم خودکار نیست.