السلام عليكم ورحمة الله وبركاته
عنوان الدرس: Mysql Transactions
مقدمة: هل واجهت في يوم من الايام، انك تريد تنفيذ مجموعة اوامر mysql متتالية
بحيث تريد ان يتم تنفيذها كلها، او في حال حصل خطأ ان يتم ايقافها كلها؟ الجواب طبعا نعم
تخيل مثلا موقع امازون، عندما تقدم طلب شراء ، فانه يتم عمل استعلامين، الاول هو وضع سجل لتحويل البضائع اليك، والامر الثاني وضع المبلغ المستحق عليك في قاعدة البيانات، تخيل ان يتم وضع الاول، وبعدها يحصل فشل في السيرفر ويتسجل المبلغ المستحق 0، طبعا ستكون كارثة لو الامور بتجري على هذا النحو. مثال اخر:
تخيل عملية تحويل مال من حساب الى حساب اخر في البنك
تريد تنقل مثلا 1000 دولار من حساب الى حساب
بدا الاستعلام الاول، وتم خصم 1000 من الحساب الاول
وحين بدا الاستعلام الثاني المسؤول عن الاضافة للحساب الاخر، حصل خطا معين وتوقع النظام
فحينها ستخصم ال 1000 ولن تضاف الى مكان اخر ، لذلك طبعا هذه الامور لا بد من تامينها
هذه الترانزاكشنز او التحويلات
نجدها دائما في العمليات البرمجية الحساسة
في البنوك ، في التجارة الالكترونة، انظمة مراقبة البضائع .... الخ
التطبيق:
تطبيق الموضوع سهل جدا، يتطلب منك شيء بسيط جدا، ولا يتطلب تعديلات كبيرة على الكود الموجود اصلا
بداية لا بد من معرفة 3 مصطلحات Begin: هي لحظة بداية ال transaction Commit: في حال نجح الاستعلام، نريد تطبيق النتائج على قاعدة البيانات rollback: في حال حصل خلل، نرجع للحالة الاصلية قبل تنفيذ الاستعلامات جميعها مثال على استعلام بدون ترانزاكشن
الطريقة عادية ومعلومة للجميع
mysql_query("delete from abc where id=2")
mysql_query("update abc where id=4")
لكن عند اضافة الترانزاكشن
بشكل بسيط
mysql_query("begin")
mysql_query("delete from abc where id=2")
mysql_query("update abc where id=4")
if (mysql_error())
mysql_query("rollback")
else
mysql_query("commit")
نلاحظ اننا بدانا بجملة begin
ثم نفذنا الاستعلامات، ثم تحققنا من وجود خطا، في حال حصل، بنعمل rollback
في حال كان عدم وجود خلل، بنعمل commit
اي نفذ الامر
لكن طريقة الكود السابق، تتميز بالبساطة وعدم الاحتراف
لذلك خلينا نطور الكود قليلا باستخدام محبوبة المبرمجين Try catch
try {
mysql_query("begin");
mysql_query('first query');
mysql_query('second query');
mysql_query('third query');
mysql_query("commit");
} catch (Exception $e) {
mysql_query("rollback");
}
الكود بسيط طبعا
ومفهوم اكثر من الكود السابق
بهذا نكون وصلنا الى نهاية درسنا لليوم
اسال الله ان تكونوا قد استفدتم واستمتعتم
ليست هناك تعليقات:
إرسال تعليق