- شنبه 25 مهر 1405 ساعت 17:00
- 3.1.9
- کامل شده
- منقضی شده
Transaction مجموعهای از عملیات دیتابیس است که باید بهصورت یک واحد منطقی اجرا شوند. اگر همه مراحل موفق باشند Commit انجام میشود و اگر یکی از مراحل شکست بخورد Rollback تغییرات را برمیگرداند. این سازوکار برای ثبت سفارش، کاهش موجودی و ثبت پرداخت اهمیت زیادی دارد.
ساختار و API اصلی
CodeIgniter 3 دو شیوه ساده و دستی دارد. در روش ساده از trans_start() و trans_complete() استفاده میکنید. در روش دستی trans_begin()، trans_commit() و trans_rollback() کنترل کاملتری میدهند. trans_status() وضعیت موفقیت عملیات را بررسی میکند.
نمونه استفاده
$this->db->trans_begin();
$this->db->insert('orders', $order);
$this->db->set('stock', 'stock - 1', FALSE)
->where('id', $productId)->update('products');
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback();
} else {
$this->db->trans_commit();
}نکته مهم
در Transaction عملیات شبکه، ارسال ایمیل یا کار زمانبر انجام ندهید. پشتیبانی واقعی Transaction به موتور و Storage Engine دیتابیس وابسته است.
مطالعه مرتبط
برای ادامه مطالعه، MVC، کوئری، ترنزکشن را ببینید.
متدهای Transaction
| متد یا مفهوم | کاربرد |
|---|---|
trans_start() و trans_complete() | مدیریت ساده Transaction. |
trans_begin() | شروع دستی. |
trans_commit() | ثبت نهایی تغییرات. |
trans_rollback() | بازگرداندن تغییرات. |
trans_status() | بررسی موفقیت عملیات. |
trans_strict() | رفتار Transactionهای متوالی. |
نکات عملی برای دیتابیس
پیش از استفاده در محیط واقعی، Driver و نسخه موتور دیتابیس را با قابلیتهای موردنیاز تطبیق دهید. Queryهای دارای ورودی کاربر باید Binding داشته باشند، عملیات چندمرحلهای باید در Transaction قرار بگیرند و برای Queryهای پرتکرار، Index و Execution Plan بررسی شود. تعداد Queryها و حجم Result نیز روی حافظه و زمان پاسخ اثر دارد.
برای عیبیابی، SQL تولیدشده، تعداد ردیفهای متاثر و زمان اجرا را در محیط توسعه ثبت کنید. در Production اطلاعات محرمانه را از Log حذف کنید و خطاهای دیتابیس را به کاربر نشان ندهید. اگر ساختار جدول تغییر میکند، تغییر را نسخهبندی و پیش از اجرا Backup بگیرید.
در بازبینی کد، ترتیب و نتیجه متدهای trans_start() و trans_complete()، trans_begin()، trans_commit()، trans_rollback() را بررسی کنید. نام متد بهتنهایی تضمین نمیکند ورودی معتبر یا خروجی امن باشد، بنابراین رفتار هر متد را با تست و مستندات همان نسخه کنترل کنید.