
#كلام_مبرمجين
الـ Transaction ؟
حديثنا اليوم عن قواعد البيانات والعمليات المترابطة .
اذا كنت بصدد تنفيذ عمليات مترابطة تتعامل مع قاعدة البيانات، وكان يتوجب أن تنفذ هذه العمليات مرة واحدة أو لا يتم الغاؤها جميعاً كيف ستقوم بعمل ذلك ، اذا كنت لم تتعرف بعد عن الـ(Transaction ) فتابع معنا .
للتعرف على مبدأ عمل الـ Transaction سنتحدث عن عملية التحويل بين الحسابات كمثال.
تتم هذه العملية على خطوتين :
- الخطوة الأولى تتمثل بسحب المبلغ من الحساب البنكي الأول.
- الخطوة الثانية تتمثل في إيداع المبلغ في الحساب البنكي المراد التحويل إليه.
لنفترض أن الخطوة الأولى قد تمت بنجاح ولنفترض أيضاً أنه فشل تنفيذ الخطوة الثانية، ما هو مصير المبلغ المسحوب الآن ؟
إن لم نقوم بمعالجة الأمر فإن المبلغ الذي تم سحبه سيفقد .
لهذا جاء مبدأ الـ Transaction او الصفقات حيث يتم وضع كافة العمليات ذات الصلة في نطاق واحد، وفي هذا النطاق يتم تنفيذ كافة العمليات المرتبطة بقاعدة البيانات، حيث سيتم تنفيذها جميعاُ في حال نجحت جميعها؛ مالم سيتم الغاء الصفقة (أي التراجع عن كافة الاستعلامات )، في حال حدث خطأ في إحدى عملية او اكثر .
و هذا المبدأ ليس حكراً على لغة برمجة معينة وانما يعتمد على قواعد البيانات وتدعمه معظمها .
لو أخذنا مثال عملي على طريقة التنفيذ في Laravel framework سيبدو الكود شبيهاً بما يلي :
\DB::beginTransaction(); //Start transaction!
try{
Statements 1
Statements 2
…..
\DB::commit();
} catch(QueryException $e)
{
\DB::rollback();
}
ولتوضيح الكود فقد قمنا ببدء عملية الـ Transaction عن طريق كتابة \DB::beginTransaction(); وما بين قوسي الجملة try سيتم تنفيذ العمليات فإذا حدث خطأ في احداها سيتم رمي استثناء ومن ثم التراجع عن كافة العمليات ما لم سيتم تنفيذها \DB::commit(); .
هل انتهينا ؟
لا، بقي جزء هام يتوجب توضيحه يتعلق بقواعد البيانات من نوع mysql ، فلو كنت تستخدمها بشكل افتراضي ستلاحظ أنه اذا حدث خطأ لن يتم التراجع عن العملية المنفذة مما يعني أن مبدأ الـ transaction لا يتم تنفيذه ، السبب في ذلك يعود إلى نوع الجدول او الجداول التي نتعامل معها في قاعدة البيانات حيث افتراضياً تكون من نوع MYISAM وهنا يتوجب تغييرها إلى InnoDB اما يدوياً عن طريق phpmyadmin او عن طريق بيناء استعلام لذلك اما اذا كنت قد بدأت مشروع جديد في لارافل علك ان تقوم بتغيير الاعدادات في ملف config/database.php في الخيار engine ليصبح كما يلي :
'engine' => 'InnoDB', .
هذا يقودنا إلى الحديث عن الفرق بين MYISAM و InnoDB لذا ربما سنقوم بإذن الله بالحديث عنه لاحقاً في منشور منفصل.
#laravel #transaction #mysql
ما هي الـ Transaction ؟
لنفترض أن لدينا حساب بنكي ونريد تحويل مبلغ من حسابك إلى حساب أخر، في البداية يجب أن تقوم بسحب المال من حسابك البنكي ومن ثم يتم تحويل المبلغ إلى الحساب الآخر لنفترض أن عملية سحب المبلغ قد تمت بنجاح ولكن حدث خطأ عند عملية التحويل إلى الحساب الآخر, في هذه الحالة المبلغ الذي تم سحبه سيضيع لهذا جاء مبدأ الترانسكشن لإتمام الصفقة وضع عملية السحب وعملية التحويل داخل نطاق واحد يسمى بالـ Transaction في هذا النطاق اذا تم تنفيذ كلا العمليتين وجمل الاستعلام ستنفذ لكلا العمليتين اما اذا حدث خطأ في إحدى العمليتين او كلاهما فسيتم الغاء الصفقة وبالتالي التراجع عن كلا العمليتين نقوم بعملية شراء عبر