21-10-12, 07:02 PM
كاتب الموضوع : Mr. Ahmed Negm
السلام عليكم ورحمة الله وبركاته
السلام عليكم ورحمة الله وبركاته
ماذا لو احتجت يوما ما أثناء كتابتك لـ Stored Procedure داخل SQL Server إلى أن تقوم بتنفيذ ثمة عمليات في نفس الوقت ؟؟؟
تعال مع نوضح بمثال جيد من الواقع العملي ... !!
أنت دخلت إلى بنك ، وتريد تحويل مبلغاً من المال ( 100 دولار ) إلى ( أحمد نجم ) ... وهنا سيقوم الموظف المختص بعمليتان :
هناك في الحالات البدائية وضع من اثنين:
في درسنا اليوم سنتعامل مع الـ TRANSACTION ، وهي الخاصة بضبط تلك المسائل ضبطاً تاماً
الشكل العام للجملة:
تعال مع نوضح بمثال جيد من الواقع العملي ... !!
أنت دخلت إلى بنك ، وتريد تحويل مبلغاً من المال ( 100 دولار ) إلى ( أحمد نجم ) ... وهنا سيقوم الموظف المختص بعمليتان :
- سحب ( 100 دولار ) من حسابك الشخصي.
- إيداع الـ ( 100 دولار ) في حساب ( أحمد نجم ).
هناك في الحالات البدائية وضع من اثنين:
- أن يكون هناك إجراء تحقق من عدم التسجيل ، وبناءا على ذلك يقوم إجراء برمجي آخر بإرجاع المبلغ المسحوب للحساب الأول.
- أو يكون البرنامج عقيم التقنية وبالتالي تضيع الـ ( 100 دولار ) على صاحبها ، ولا تصل كذلك للحساب المحول له.
في درسنا اليوم سنتعامل مع الـ TRANSACTION ، وهي الخاصة بضبط تلك المسائل ضبطاً تاماً
الشكل العام للجملة:
كود :
[COLOR=#000000][COLOR=#0000bb] BEGIN TRANSACTION
[/COLOR][color=#007700]-- [/color][color=#0000bb]العملية الأولى [/color][color=#007700]-- [/color][COLOR=#0000bb]INSERT INTO
[/COLOR][color=#007700]-- [/color][color=#0000bb]العملية الثانية [/color][color=#007700]-- [/color][COLOR=#0000bb]UPDATE
[/COLOR][color=#007700]-- [/color][color=#0000bb]العملية الثالثة [/color][color=#007700]-- [/color][COLOR=#0000bb]DELETE
[/COLOR][color=#007700]-- [/color][color=#0000bb]الخ [/color][COLOR=#007700]--
[/COLOR][COLOR=#0000bb]COMMIT TRANSACTION
[/COLOR][/COLOR]
راجع المثال التالي كي تلاحظ الكود بشكل أكبر ، علماً بأن قاعدة البيانات باسم ( BANK ) ، وجدول العملاء باسم ( CUSTOMERS ) ، وحقل الرصيد باسم ( BALANCE ).
كود :
[color=#000000][COLOR=#0000bb] [/color][color=#007700]USE [[/color][color=#0000bb]BANK[/color][COLOR=#007700]]
[/COLOR][COLOR=#0000bb]BEGIN TRANSACTION
[/COLOR][color=#007700]-- [/color][color=#0000bb]First Code [/color][COLOR=#007700]--
[/COLOR][color=#0000bb]UPDATE [/color][color=#007700][[/color][color=#0000bb]CUSTOMERS[/color][color=#007700]] [/color][color=#0000bb]SET [/color][color=#007700][[/color][color=#0000bb]BALANCE[/color][color=#007700]] = [[/color][color=#0000bb]BALANCE[/color][color=#007700]] - [/color][color=#0000bb]100 WHERE [/color][color=#007700][[/color][color=#0000bb]NAME[/color][color=#007700]] = [/color][COLOR=#dd0000]'Abdo'
[/COLOR][color=#007700]-- [/color][color=#0000bb]Second Code [/color][COLOR=#007700]--
[/COLOR][color=#0000bb]UPDATE [/color][color=#007700][[/color][color=#0000bb]CUSTOMERS[/color][color=#007700]] [/color][color=#0000bb]SET [/color][color=#007700][[/color][color=#0000bb]BALANCE[/color][color=#007700]] = [[/color][color=#0000bb]BALANCE[/color][color=#007700]] + [/color][color=#0000bb]100 WHERE [/color][color=#007700][[/color][color=#0000bb]NAME[/color][color=#007700]] = [/color][COLOR=#dd0000]'Ahmed'
[/COLOR][COLOR=#0000bb]COMMIT TRANSACTION
[/COLOR][/COLOR]
وبذلك تضمن تماماً عدم تنفيذ أياً من العمليات والأكواد المكتوبة إلا إذا تم تنفيذ الجميع بشكل سليم ، وأكيد ستتساءل عن كيفية عمل مثل هذه العمليات فنيا داخل محرك السيكوال سيرفر ، فكيف يقوم المحرك ذاته بالتراجع عن إجراء قد قام بتنفيذه بالفعل ، وماذا إذا كان هذا الإجراء معقد نوعاً ما ... وهنا سأجيبك بأن هذا كله يتم تنفيذه داخل ملف الـ LOG الخاص بقاعدة البيانات ، وحين يصل الكومبايلر للسطر COMMIT ، فحينها يتم تطبيق تلك السطور الكودية على قاعدة البيانات ذاتها
بالتوفيق للجميع