الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

العمليات Transactions

مغلق
بدأه Whale في 20 مايو 2007 · 5 رد · 4,626 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

موضوع معالجة العمليات او بما يسمى Transaction Processing هو من المواضيع المهمة التي يجب علينا معرفتها و استخدامها بشكل المناسب.

ساحاول في هذا الموضوع القاء الضوء على ال Transactions و كيفية الاستفادة منها.

هذا الموضوع ليس كاملا ولهذا ادعو الاعضاء المشاركة بما لديهم من معلومات ليكون مرجعا لنا جميعا.

ماهو ال Transaction

==============

هو يشير الي عملية تجميع التغييرات التي تمت على البيانات في حزم Batches بحيث تعامل كل حزمة Batch كوحدة ذرية وحيدة Single atomic unit . وهذا يعني كل التغييرات التي تمت على البيانات في الحزمة الواحدة اما ان تنجح جميعا او تفشل جميعا.

دعني اوضح هذا المعنى بطريقة اخرى...

ما اعنيه هو انه يمكنك تحديد مجموعة من التعليمات التي تؤثر على البيانات (مثل تعليمة الاضافة Insert و تعليمة التحديت Update و تعليمة حذف السجل Delete و تعليمة حذف الجدول Drop و تعليمة الانشاء Create وغيرها الكثير) على انها تعليمات ذرية أي ان جميع التعليمات اما ان تقبل جميعا او ان ترفض حميعا ولا يوجد حل وسط.. بالعربي الفصيح يابيض ياسود مافيش لون رمادي.

مثال توضيحي:

--------------

1- ابدأ العملية – هنا نحدد بداية الحزمة

2- احذف السجل رقم 10 من جدول المودعين

3- اضف سجل في جدول الاصناف

4- احذف جدول الاصناف الاحطياطي من قاعدة البيانات

5- اقبل حميع التغييرات او ارفضها – نهاية الحزمة

لاحظ معي ان البند رقم 5 نتيجته تعتمد على على الموافقة بنعم او لا؟؟؟

فأذا تمت الموافقة على التغييرات فأن التعليمات من 2 الي 4 ستعتمد و تصبح التغييرات دائمة في قاعدة بياناتنا!

اما اذا تم الرفض فان التعليمات من 2 الي 4 ستلغي جميعا ولن يكون هناك أي اثر على قاعدة بياناتنا.

الان فكر معي قليلا ماذا اذا تم تنفيذ التعليمة رقم 2 بنجاح بينما حدث خطأ عند تنفيذا التعليمة رقم 3 ما الذي سيحدث؟؟؟

الاجابة بسيطة!! ستلغي جميع التغييرات وهذا يعني انه ستلغي التعليمة رقم 2 رغم انها نفذت بنجاج و السبب كما فلنا ان العملية ذرية اما ان تنجح جميعا او تلغى جميعها.

ارجو ان يكون المفهوم واضحا الان.

كيف يمكن تمثيل ال Transactions في الاكسس

===========================

يدعم الاكسس ال Transactions من خلال ثلاث دوال او طرق Methods خاصة بالكائن WorkSpace و هي:

BeginTrans : وهي تخبر الاكسس ببداية الحزمة Batch

CommitTrans : تخبر الاكسس بقبول كل تعليمات الحزمة.

Rollback : تخبر الاكسس بوجوب رفض كل تعليمات الحزمة

مثال عملي

======

في هذا المثال سنشرح واحد من اشهر الامثلة التي تشرح فكرة ال Transaction الا وهو عملية تحويل مبلغ من المال من حساب بنكي الي حساب اخر.

قاعدة البيانات تتكون من جدول واحد باسم Account ويحتوي على حقلان وهما AccountID و الحقل AccountBalance

هنا سننشئ دالة وضيفتها تحويل مبلغ من المال من حساب الي رصيد حساب اخر. وسيترتب على هذه العملية ان رصيد الحساب المحول منه سيخفض بقدر المبلغ المحول بينما رصيد الحساب المحول اليه سيزيد بمقدار المبلغ المحول.

هذه العملية في غاية الخطورة وذلك انه اذا حدث خطأ فسيترتب على ذلك ضياع الحقوق و مشاكل جمة. تخيل ان المبلغ قد خصم من الحساب المحول منه و لكن قبل زيادة رصيد الحساب المحول الية حدث خطأ (انقطعت الكهربا, , حدث خطأ في النظام و و و ) هل ترى المشكلة الان اذا صديقنا ال Transaction سيمنع ذلك.

القي نظرة على الكود

Private Function TransferMoney(ByVal lngFromAccount As Long, ByVal lngToAccount As Long, ByVal lngMoney As Long) As Boolean
On Error GoTo ErrorHandler
Dim blnTransactionIsCommited As Boolean
Dim strSQL As String
Dim wrkWorkSpace As DAO.Workspace
Dim dbCurrentDatabase As DAO.Database

blnTransactionIsCommited = True

Set wrkWorkSpace = DBEngine.Workspaces(0)
Set dbCurrentDatabase = CurrentDb

'Begin the Transaction
Call wrkWorkSpace.BeginTrans

strSQL = "UPDATE Account SET Account.AccountBalance = Account.AccountBalance - " & lngMoney
strSQL = strSQL & " WHERE (((Account.AccountID)= " & lngFromAccount & "));"

Call dbCurrentDatabase.Execute(strSQL)

strSQL = "UPDATE Account SET Account.AccountBalance = Account.AccountBalance + " & lngMoney
strSQL = strSQL & " WHERE (((Account.AccountID)= " & lngToAccount & "));"

Call dbCurrentDatabase.Execute(strSQL)

'Now commit all queries together
Call wrkWorkSpace.CommitTrans

CleanUpAndExit:
TransferMoney = blnTransactionIsCommited
Call dbCurrentDatabase.Close
Call wrkWorkSpace.Close
Exit Function

ErrorHandler:
' Rollback all queries
Call wrkWorkSpace.Rollback

blnTransactionIsCommited = False
Call MsgBox("Error#" & Err.Number & vbCrLf & "Description: " & Err.Description)
Resume CleanUpAndExit

End Function

انظر المثال المرفق

تحياتي لكم جميعا

Whale

#3

السلام عليكم

اطلعت على الموضوع , وربطت في ذهني بينه وبين ما طرحته على الرابط :

هنا

وقد استوعبت الآن أو يهيأ لي إني استوعبت الدرس فشكرا

أبو تماضر

#4

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

شكراً لك أخي Whale

كل يوم تطلع لنا بشيء جديد

#5

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

شكراً لك أخي Whale على هذا الإبداع

فكر نيّر لموضوع هام .. وفقك الله نتظر الجديد المفيد منك دوما

أخوك / EKSEER

#6

الاخ الفضل alasomed مشرفنا مصلح الحريصي الاخ الفاضل ekseer شكرا جزيلا لكلماتكم الطيبة و تشجيعكم..اتمنى ان اكون عند حسن ظنكم بي

استخدم ال Transaction مع النماذج من نوع Bound

================================

في المرة السابقة تحدثنا عن فكرة ال Transaction و طريقة عملها. كما اعطينا مثالا على ذلك. المثال كان عبارة عن دالة مسئولة عن التحويل بين الحسابات. هذا المثال اعطي فكرة عن كيفية استخدام ال Transaction في الاكسس.

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

معظمنا يستخدم النموذج Bound Form لادخال البيانات و معالجتها لهذا فانه من المستحسن معرفة كيفية استخدام ال Transaction على مستوى النماذج.

يمكن تحقيق ذلك عن طريق الخاصية Recordset التابعة النموذج مع DAO

Set Me.Recordset = CurrentDb.OpenRecordset("Table Name", dbOpenDynaset)

اما بقية التعليمات فهي نفسها لا يوجد أي اختلاف جوهري.

المهم لكي نرفع معدل الانتاجية لدينا و لكي نوفر الجهد عند استخدام ال Transaction في اكثر من نموذج فقد صممت وحدة نمطية Module اسميتها modTransaction يمكن استخدامها مع أي نموذج نرغب بتطبيق ال Transaction عليه.

Option Compare Database
Option Explicit

Public Const WAL_COMMIT_TRANSACTION As Boolean = True
Public Const WAL_ROLLBACK As Boolean = False

Public Sub OpenFormRecordset(ByRef frmMe As Form, ByVal strSQL As String)
On Error GoTo ErrorHandler

Set frmMe.Recordset = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

CleanUpAndExit:
Exit Sub

ErrorHandler:
Call MsgBox("Error#" & Err.Number & vbCrLf & "Description: " & Err.Description)
Resume CleanUpAndExit
End Sub

Public Sub BeginTransaction()
On Error GoTo ErrorHandler

Call DBEngine.BeginTrans

CleanUpAndExit:
Exit Sub

ErrorHandler:
Call MsgBox("Error#" & Err.Number & vbCrLf & "Description: " & Err.Description)
Resume CleanUpAndExit
End Sub

Public Sub EndTransaction(ByVal blnTransactionIsCommitted As Boolean)
On Error GoTo ErrorHandler

If blnTransactionIsCommitted = True Then
  Call DBEngine.CommitTrans
Else
  Call DBEngine.Rollback
End If

CleanUpAndExit:
Exit Sub

ErrorHandler:
Call DBEngine.Rollback
Call MsgBox("Error#" & Err.Number & vbCrLf & "Description: " & Err.Description)
Resume CleanUpAndExit
End Sub

هذه الوحدة سنحاول ان نطورها عندما نبدأ بالحديت عن استخدم ال Transaction مع احداث النموذج

حمل الملف من الرابط التالي...لسسب ما لم استطع ارفاق الملف عن طريق المنتدى

حمل الملف

حاول اضافة سجلات و حذفها و تعديلها و من ثم انظر كيف ال Transaction يعتمدها او يرفضها

تحياتي

Whale

تم تعديل هذه المشاركة بواسطة Whale في 22 مايو 2007 في 01:44

هذا الموضوع مغلق.

مواضيع مشابهة