نبدا على بركة الله
عنوان الدرس: Mysql Transactions

مقدمة: 
هل واجهت في يوم من الايام، انك تريد تنفيذ مجموعة اوامر mysql متتالية
بحيث تريد ان يتم تنفيذها كلها، او في حال حصل خطأ ان يتم ايقافها كلها؟ الجواب طبعا نعم [transactions] عمل الترانزاكشن في قواعد بيانات mysql ، مهم جدا Tears

تخيل مثلا موقع امازون، عندما تقدم طلب شراء ، فانه يتم عمل استعلامين، الاول هو وضع سجل لتحويل البضائع اليك، والامر الثاني وضع المبلغ المستحق عليك في قاعدة البيانات، تخيل ان يتم وضع الاول، وبعدها يحصل فشل في السيرفر ويتسجل المبلغ المستحق 0، طبعا ستكون كارثة لو الامور بتجري على هذا النحو.
 

مثال اخر:
تخيل عملية تحويل مال من حساب الى حساب اخر في البنك
تريد تنقل مثلا 1000 دولار من حساب الى حساب
بدا الاستعلام الاول، وتم خصم 1000 من الحساب الاول
وحين بدا الاستعلام الثاني المسؤول عن الاضافة للحساب الاخر، حصل خطا معين وتوقع النظام

فحينها ستخصم ال 1000 ولن تضاف الى مكان اخر ، لذلك طبعا هذه الامور لا بد من تامينها
 

هذه الترانزاكشنز او التحويلات
نجدها دائما في العمليات البرمجية الحساسة
في البنوك ، في التجارة الالكترونة، انظمة مراقبة البضائع .... الخ

الان يكفي كلاما، ولنتجه الى التطبيق 
[transactions] عمل الترانزاكشن في قواعد بيانات mysql ، مهم جدا Icon30

التطبيق:http://www.starsat2014.01lx.net/index.php
تطبيق الموضوع سهل جدا، يتطلب منك شيء بسيط جدا، ولا يتطلب تعديلات كبيرة على الكود الموجود اصلا
بداية لا بد من معرفة 3 مصطلحات

Begin: هي لحظة بداية ال transaction
Commit: في حال نجح الاستعلام، نريد تطبيق النتائج على قاعدة البيانات
rollback: في حال حصل خلل، نرجع للحالة الاصلية قبل تنفيذ الاستعلامات جميعها

مثال على استعلام بدون ترانزاكشن
الطريقة عادية ومعلومة للجميع



رمز PHP:
الكود:
mysql_query("delete from abc where id=2")  
mysql_query("update abc where id=4")  

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
لكن عند اضافة الترانزاكشن
بشكل بسيط

رمز PHP:
الكود:
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
اي نفذ الامر

لكن طريقة الكود السابق، تتميز بالبساطة وعدم الاحتراف [transactions] عمل الترانزاكشن في قواعد بيانات mysql ، مهم جدا Tears
لذلك خلينا نطور الكود قليلا باستخدام محبوبة المبرمجين Try catch

رمز PHP:
الكود:

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"); 
}  
http://www.starsat2014.01lx.net/index.php

الكود بسيط طبعا 
ومفهوم اكثر من الكود السابق

بهذا نكون وصلنا الى نهاية درسنا لليوم
اسال الله ان تكونوا قد استفدتم واستمتعتم
اي استفسار حياكم الله
ونراكم في درس قادم ان شاء الله
والسلام عليكم ورحمة الله وبركاته