منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كيفية اعتماد واستخدام الـ TRANSACTIONS داخل SQL Server
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : Mr. Ahmed Negm


السلام عليكم ورحمة الله وبركاته

ماذا لو احتجت يوما ما أثناء كتابتك لـ Stored Procedure داخل SQL Server إلى أن تقوم بتنفيذ ثمة عمليات في نفس الوقت ؟؟؟

تعال مع نوضح بمثال جيد من الواقع العملي ... !!

أنت دخلت إلى بنك ، وتريد تحويل مبلغاً من المال ( 100 دولار ) إلى ( أحمد نجم ) ... وهنا سيقوم الموظف المختص بعمليتان :

  1. سحب ( 100 دولار ) من حسابك الشخصي.
  2. إيداع الـ ( 100 دولار ) في حساب ( أحمد نجم ).
ولكن ماذا إذا كانت هذه العملية تتم على ( الكمبيوتر ) ، وبعد سحب المبلغ من الحساب الأول ، صادف البرنامج خطأ ما أثناء التسجيل في الحساب الثاني ؟؟؟

هناك في الحالات البدائية وضع من اثنين:

  1. أن يكون هناك إجراء تحقق من عدم التسجيل ، وبناءا على ذلك يقوم إجراء برمجي آخر بإرجاع المبلغ المسحوب للحساب الأول.
  2. أو يكون البرنامج عقيم التقنية وبالتالي تضيع الـ ( 100 دولار ) على صاحبها ، ولا تصل كذلك للحساب المحول له.
كذلك :: ماذا إن لم تكن عمليتي سحب وإيداع ... فلنفترض إنها مثلا 10 عمليات سحب ، 5 إيداع ، 5 تحويل وتسوية ... الخ ؟؟ ... أظن سيزداد الوضع سوءاً خاصة إذا كنت تبحث عن تزامن التنفيذ وعدم فقدان أي عملية من العمليات المحدد ، فإما يلغي التنفيذ للجميع ، وإما يُنفذوا بالكامل.

في درسنا اليوم سنتعامل مع الـ 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 ، فحينها يتم تطبيق تلك السطور الكودية على قاعدة البيانات ذاتها


بالتوفيق للجميع