أين أضع تعليمات Transaction؟
#1
السلام عليكم و رحمة الله و بركاته

هل يكفي وضع تعليمات Transaction في Procedure الخاصة بزر موافق فقط.

أم أضعها كذلك مثلا في الاحداث OnBeforePost و OnAfterPost و أحداث أخرى.

بمعنى آخر أين أضع هذه الصفقات؟ و لماذا هذه الاماكن؟
الرد
#2
وعليكم السلام ورحمة الله وبركاته ومغفرته

حسب الحاجة تضع الاوامر
مثلا لتفادي انقطاع التيار او تجمد النظام فإنه يستحين بعد كل عملية Post
اما غيره فمثلا عند اغلاق البرنامج
لأستهلنّ الصعب أو أدرك المنى    فما انقادت الآمال إلاّ لصابر
الرد
#3
السلام عليكم...

تحتاج إلى الـ Transaction فقط عندما تريد تنفيذ عمليات (إضافة، تعديل، حذف) مرتبطة معاً على أكثر من جدول واحد، بحيث إما تتم العمليات على كل الجداول أو تلغى من كل الجداول.

مثلاً:

إذا كان لدينا جدول الطلبيات (Orders) يحتوي على بيانات مثل: رقم الطلبية، تاريخ الطلبية، رقم الزبون صاحب الطلبية، ... إلخ. و جدول تفاصيل الطلبيات (OrderDetails) يحتوي على بيانات مثل رقم الصنف، الكمية المطلوبة، سعر البيع... إلخ. (و طبعاً رقم الطلبية كمفتاح أجنبي).

في مثل هذه الحالة، إذا لم نستعمل الـ Transaction فإنه هناك احتمال أن يتم تسجيل بيانات الطلبية (في الجدول Orders) دون أن يتم حفظ البيانات في جدول التفاصيل (OrderDetails) ربما مثلاً بسبب انقطاع الكهرباء عن الجهاز، أو خلل في البرنامج، أو انقطاع الاتصال عبر الشبكة، أو حتى خلل في نظام التشغيل.

حينئذٍ سيكون لدينا طلبية فارغة (دون تفاصيل أو أصناف)، و ربما أيضاً يحدث العكس.

إذن سيكون من المفيد أن تكون لدينا طريقة نضمن بها أن البيانات سيتم حفظها في كلا الجدولين معاً أو يتم إلغاؤها من الجدولين معاً، و هذه هي وظيفة الـ Transaction.

إذا كنت تستخدم مكونات الـ ADO فإن الشكل العام لكود الحفظ سيكون كالتالي:

كود :
try ADOConnection1.BeginTrans // ابدأ الصفقة // ... // خطوات حفظ البيانات في الجدول الأول // ... // ... // خطوات حفظ البيانات في الجدول الثاني // ... // ... if ADOConnection1.InTransaction then begin // الأمور تمام. احفظ كل البيانات في كل الجداول ADOConnection1.CommitTrans; ShowMessage('تم حفظ البيانات'); end; except // حدث خطأ on E: Exception do begin if ADOConnection1.InTransaction then ADOConnection1.RollbackTrans; // ألغِ كافة الإجراءات التي تمت على كل الجداول ShowMessage('حدث خطأ عند محاولة حفظ البيانات' + #13#10 + E.Message); end; end;

نرجو الاستفادة و السلام.
الرد
#4
شكرا أخي ناجي و موبيل

لو تذكروا لي الفرق بين Transaction و خاصية LockType و هل استعمالهما مع بعض يوقع مشاكل؟

والله لقد أفدتماني خاصة الأخ ناجي.
جزاكم الله كل الخير
الرد
#5
السلام عليكم...

لا علاقة بين الـ Transactionو الـ LockType.

فالـ Transaction هو - كما ذكرنا سابقاً - وسيلة لضمان حفظ البيانات في أكثر من جدول (أو عدم حفظها جميعاً).

أما الـ LockType فهي خاصية للـ DataSet تحدد كيفية قفل السجلات عند إجراء تعديلات عليها (لمنع التعديلات من مستخدمين آخرين للجدول)، و قيمها كالتالي:
  • Optimistic: يتم قفل السجل فقط عند استدعاء الوظيفة Update للـ ADO.Recordset التي تمثلها الـ DataSet (الوظيفة Post في دلفي). أي يتم قفل السجل عندما يستلم محرك قواعد البيانات أمراً بحفظ التعديلات.
  • Pessimistic: يتم قفل السجل عند البدء في تعديل السجل (الوظيفة Edit في دلفي).
  • ReadOnly: السجلات للقراءة فقط، و لا يمكن إجراء (حفظ) تعديلات عليها.
  • BatchOptimistic: يستعمل مع أسلوب حفظ الدفعة (Batch Update Mode). هذا يحتاج أن يدعم محرك قواعد البيانات هذا الأسلوب. و في هذه الحالة يمكن تخزين العديد من التغييرات (caching multiple changes) بشكل موضعي في الذاكرة (على سجل واحد أو أكثر) ثم استدعاء الوظيفة UpdateBatch لمحاولة حفظ كل التعديلات معاً.
القيمة الأخيرة (BatchOptimistic) لا علاقة لها بالـ Transaction فهي تحدد طريقة حفظ التعديلات على DataSet واحدة (أي جدول واحد).

نرجو الاستفادة و السلام.
الرد
#6
كنت فقط أسأل عن الفرق إن كان.
الله يسترك في الدنيا و الاخرة.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 3 ) ضيف كريم