تراکنش: گروهی از دستورها که یا همه اجرا میشوند، یا هیچکدام
فرض کن میخواهی ۱۰۰٬۰۰۰ تومان از حساب علی به حساب زهرا منتقل کنی. این کار دو دستور جدا نیاز دارد: کمکردن از حساب علی، و اضافهکردن به حساب زهرا. اگر دستور اول اجرا شود اما درست وسط راه (مثلاً بهخاطر قطعی برق یا خرابی شبکه) دستور دوم هرگز اجرا نشود، پول علی کم شده اما به حساب زهرا نرسیده — پول بهطور واقعی «گم» شده است. تراکنش (Transaction) دقیقاً همین مشکل را حل میکند.
ساختار پایه: BEGIN، COMMIT و ROLLBACK
BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100000 WHERE id = 1; UPDATE accounts SET balance = balance + 100000 WHERE id = 2; COMMIT;
BEGIN TRANSACTION شروع یک بلوک تراکنشی را اعلام میکند؛ از این لحظه، تغییرات فقط بهصورت موقت و «آزمایشی» اعمال میشوند. COMMIT همهی این تغییرات را برای همیشه قطعی میکند. بیا این را روی دو حساب واقعی امتحان کنیم:
ROLLBACK — پشیمان شدن از یک تراکنش
اگر پیش از COMMIT متوجه اشتباهی شوی (یا برنامه خطا بدهد)، ROLLBACK همهی تغییرات آن تراکنش را کاملاً به حالت قبل برمیگرداند — انگار هیچوقت اتفاق نیفتاده:
BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100000 WHERE id = 1; UPDATE accounts SET balance = balance + 100000 WHERE id = 2; ROLLBACK;
بیا امتحان کنیم:
UPDATE اجرا شد، چون بهجای COMMIT، ROLLBACK زدیم، هر دو حساب دقیقاً به مقدار اولشان (۵۰۰٬۰۰۰ و ۲۰۰٬۰۰۰) برگشتند — انگار این دو خط هرگز اجرا نشدهاند.در SQL Server: نام کمی متفاوت
SQLite (این Playground) از BEGIN TRANSACTION پشتیبانی میکند؛ در SQL Server معمولاً کوتاهترش مینویسند:
BEGIN TRAN; -- مخفف BEGIN TRANSACTION، رایج در SQL Server
جمعبندی این درس
- تراکنش، گروهی از دستورها را به یک واحد منطقی تبدیل میکند: یا همه اجرا میشوند، یا هیچکدام.
COMMITتغییرات را برای همیشه قطعی میکند.ROLLBACKهمهی تغییرات تراکنش را کاملاً لغو میکند.- مثال کلاسیک: انتقال وجه بین دو حساب — بدون تراکنش، پول میتواند در میانهی راه «گم» شود.
در درس بعدی، سراغ چهار اصل معروف ACID میرویم که رفتار درست هر تراکنش را تضمین میکنند — و یک نکتهی مهم و غافلگیرکننده دربارهی اینکه atomicity همیشه هم خودکار نیست.