14-10-12, 09:15 PM
Transactions :
هذه هي النقطة الأخيرة التي سنتحدث عنها لهذا اليوم ، تعريف هذه العملية باختصار شديد هو وجود مجموعة من العمليات لا بد أن تتم سوية أو تتوقف سوية ، المثال الأشهر لهذه العملية هي عمليات التحويل البنكية من عميل1 إلى عميل2 .
لذا خطوات العمل في قواعد البيانات لا بد أن تكون بالشكل التالي :
- سحب 500 دولار من حساب عميل 1 .
- ايداع 500 دولار في حساب عميل 2 .
وهاتان العمليتان لابد ان تتم سوية ، بمعنى لو تمت العملية الأولى ولم تتم العملية الثانية لانقطاع الاتصال مثلاً فهذا غير مقبول ، لذا لا بد ان يتم اعتماد العمليتين أو حذف اي عملية منهم تتم دون الأخرى وهو ما يعرف باسم roll back .
إذا قمنا بعمل transaction سيتم تعريف هذه المجموعة من العمليات في نظام قاعدة البيانات DBMS على شكل وحدة واحدة بحيث يتم تنفيذها سوية او عدم تنفيذها سوية .
الفئة المسؤولة عن هذه العملية لدينا هي الفئة SqlTransaction الموجودة ضمن مجال الأسماء System.Data.SqlClient ، هناك فئات أخرى يمكنها تطبيق هذه العملية ضمن مجال أسماء .net ايضاً مثل :
System.EnterpriseServices : تتيح لنا هذه الفئة الاتصال مع مكونات COM+ التي تقدم لنا الدعم في هذه العملية .
System.Transactions : تتيح لنا هذه الفئة بناء تطبيقات تدعم ال transactions .
WCF و WWF : تمكننا هاتان الفئتان من تطبيق مبادئ ال transaction ايضاً .
حتى في نظم قواعد البيانات يمكنك القيام بهذه المهمة عن طريق تعريف Stored Procedure يقوم بعمل transactions عن طريق TRANSACTIONو ROLLBACKو COMMIT ، يمكنك البدء في هذا النوع من هنا :
http://msdn.microsoft.com/en-us/library/ms187844.aspx
في ADO.net لدينا الفئة DBTransaction التي تطبق الواجهة IDbTransaction interface والذي يحتوي على الدوال الرئيسية التالية :
C#:
vb.net:
يضيف لنا ال SqlTransaction دالة جديدة هي Save والتي تتيح لنا حفظ نقطة يتم الرجوع إليها في حالة الفشل في اتمام العملية بدل الرجوع في العملية بالكامل - لو كان هناك اجزاء من العملية أو العملية على مراحل - .
ابسط مثال على تطبيق هذه العملية ، هو افتراض وجود جدول يحتوي على ( اسم العميل - المبلغ المودع ) وعندما نقوم بعملية تحويل من حساب إلى آخر نقوم بعملية بالشكل التالي :
C#:
vb.net:
في هذه العملية ولأي سبب كان قد يتوقف الجزء الثاني من العملية ، لذا سنحاول اخبار نظام قاعدة البيانات بأننا سننفذ كلا العمليتين في نفس الوقت ، ولو لم يتم تنفيذ واحدة منهما سيتم الغاء الأخرى مباشرة .
C#:
vb.net:
كما لاحظت ، نقوم ببدء عملية ال transaction ، وما لم يحدث أي خطأ فلن ندخل في الشرط ولذا سيتم تنفيذ دالة Commit لتنفيذ العمليتين واعتمادهما ، أما في حالة حدوث اي خطأ فسنقوم برمي throw Exception والذي ينقلنا مباشرة إلى Catch لنقوم هناك باستدعاء الدالة rollback من اجل الغاء جميع التأثيرات التي حدثت .
لو كنت تود تجربة هذا المثال لمعرفة كيفية حدوثة ، جرب جعل قيمة throwEx=true وجرب ما يحدث .
لو جربت مثالك الآن ستجد ان قيمة مبلغ العميل 1 مثلاً لم تتأثر ، أما في حالة عدم وجود خطأ في الجملة الثانية فستجد ان الكمية المحددة من المبلغ قد تم نقلها من عميل 1 إلى عميل 2 .
*** طبعاً في تطبيقاتك الجدية لن يكون نظام الايداع والصرف بهذا الشكل ، بل في العادة سيكون هناك جدول او اكثر من جدول يحتوي على العمليات المجراه لكل عميل من ايداع وصرف وسحب وخلافه .
إلى هنا نكون قد انتهينا من دروس هذا اليوم من أجل ADO.net والوضع المتصل ، في الدرس القادم سوف نتعرف سوية بإذن الله على الوضع المنفصل قبل ان يكون درسنا الأخير في عالم قواعد البيانات من أجل مبادئ LINQ .
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته ...
هذه هي النقطة الأخيرة التي سنتحدث عنها لهذا اليوم ، تعريف هذه العملية باختصار شديد هو وجود مجموعة من العمليات لا بد أن تتم سوية أو تتوقف سوية ، المثال الأشهر لهذه العملية هي عمليات التحويل البنكية من عميل1 إلى عميل2 .
لذا خطوات العمل في قواعد البيانات لا بد أن تكون بالشكل التالي :
- سحب 500 دولار من حساب عميل 1 .
- ايداع 500 دولار في حساب عميل 2 .
وهاتان العمليتان لابد ان تتم سوية ، بمعنى لو تمت العملية الأولى ولم تتم العملية الثانية لانقطاع الاتصال مثلاً فهذا غير مقبول ، لذا لا بد ان يتم اعتماد العمليتين أو حذف اي عملية منهم تتم دون الأخرى وهو ما يعرف باسم roll back .
إذا قمنا بعمل transaction سيتم تعريف هذه المجموعة من العمليات في نظام قاعدة البيانات DBMS على شكل وحدة واحدة بحيث يتم تنفيذها سوية او عدم تنفيذها سوية .
الفئة المسؤولة عن هذه العملية لدينا هي الفئة SqlTransaction الموجودة ضمن مجال الأسماء System.Data.SqlClient ، هناك فئات أخرى يمكنها تطبيق هذه العملية ضمن مجال أسماء .net ايضاً مثل :
System.EnterpriseServices : تتيح لنا هذه الفئة الاتصال مع مكونات COM+ التي تقدم لنا الدعم في هذه العملية .
System.Transactions : تتيح لنا هذه الفئة بناء تطبيقات تدعم ال transactions .
WCF و WWF : تمكننا هاتان الفئتان من تطبيق مبادئ ال transaction ايضاً .
حتى في نظم قواعد البيانات يمكنك القيام بهذه المهمة عن طريق تعريف Stored Procedure يقوم بعمل transactions عن طريق TRANSACTIONو ROLLBACKو COMMIT ، يمكنك البدء في هذا النوع من هنا :
http://msdn.microsoft.com/en-us/library/ms187844.aspx
في ADO.net لدينا الفئة DBTransaction التي تطبق الواجهة IDbTransaction interface والذي يحتوي على الدوال الرئيسية التالية :
C#:
كود :
public interface IDbTransaction : IDisposable
{
IDbConnection Connection { get; }
IsolationLevel IsolationLevel { get; }
void Commit();
void Rollback();
}vb.net:
كود :
[SIZE=3]Public Interface IDbTransaction
Inherits IDisposable
ReadOnly Property Connection() As IDbConnection
ReadOnly Property IsolationLevel() As IsolationLevel
Sub Commit()
Sub Rollback()
End Interface [/SIZE]يضيف لنا ال SqlTransaction دالة جديدة هي Save والتي تتيح لنا حفظ نقطة يتم الرجوع إليها في حالة الفشل في اتمام العملية بدل الرجوع في العملية بالكامل - لو كان هناك اجزاء من العملية أو العملية على مراحل - .
ابسط مثال على تطبيق هذه العملية ، هو افتراض وجود جدول يحتوي على ( اسم العميل - المبلغ المودع ) وعندما نقوم بعملية تحويل من حساب إلى آخر نقوم بعملية بالشكل التالي :
C#:
كود :
[SIZE=3]SqlCommand cmdGet = new SqlCommand("update customers set total=total-" + totalmoney.ToString() + " where ID" + custID.ToString(), cn);
cmdSelect.ExecuteNonQuery();[/SIZE]
[SIZE=3]SqlCommand cmdSet = new SqlCommand("update customers set total=total+" + totalmoney.ToString() + " where ID" + SuppID.ToString(), cn);
cmdSelect.ExecuteNonQuery();[/SIZE]vb.net:
كود :
[SIZE=3]Dim cmdGet As New SqlCommand("update customers set total=total-" + totalmoney.ToString() + " where ID" + custID.ToString(), cn)
cmdSelect.ExecuteNonQuery() [/SIZE]
[SIZE=3]
Dim cmdSet As New SqlCommand("update customers set total=total+" + totalmoney.ToString() + " where ID" + SuppID.ToString(), cn)
cmdSelect.ExecuteNonQuery() [/SIZE]في هذه العملية ولأي سبب كان قد يتوقف الجزء الثاني من العملية ، لذا سنحاول اخبار نظام قاعدة البيانات بأننا سننفذ كلا العمليتين في نفس الوقت ، ولو لم يتم تنفيذ واحدة منهما سيتم الغاء الأخرى مباشرة .
C#:
كود :
[SIZE=3]SqlCommand cmdGet = new SqlCommand("update customers set total=total-" + totalmoney.ToString() + " where ID" + custID.ToString(), cn);
SqlCommand cmdSet = new SqlCommand("update customers set total=total+" + totalmoney.ToString() + " where ID" + SuppID.ToString(), cn);[/SIZE]
[SIZE=3]SqlTransaction sqltr = null;
try
{
sqltr = sqlCn.BeginTransaction();[/SIZE]
[SIZE=3]cmdGet.Transaction = sqltr;
cmdSet.Transaction = sqltr;[/SIZE]
[SIZE=3]cmdGet.ExecuteNonQuery();
cmdSet.ExecuteNonQuery();[/SIZE]
[SIZE=3]if (throwEx)
{
throw new ApplicationException("all operation canceld, some errors occures");
}[/SIZE]
[SIZE=3]sqltr.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
tx.Rollback();
}
}[/SIZE]vb.net:
كود :
[SIZE=3]Dim cmdGet As New SqlCommand("update customers set total=total-" + totalmoney.ToString() + " where ID" + custID.ToString(), cn)
Dim cmdSet As New SqlCommand("update customers set total=total+" + totalmoney.ToString() + " where ID" + SuppID.ToString(), cn) [/SIZE]
[SIZE=3]Dim sqltr As SqlTransaction = Nothing
Try
sqltr = sqlCn.BeginTransaction()
cmdGet.Transaction = sqltr
cmdSet.Transaction = sqltr
cmdGet.ExecuteNonQuery()
cmdSet.ExecuteNonQuery()
If throwEx Then
Throw New ApplicationException("all operation canceld, some errors occures")
End If
sqltr.Commit()
Catch ex As Exception
MessageBox.Show(ex.Message)
tx.Rollback()
End Try [/SIZE]كما لاحظت ، نقوم ببدء عملية ال transaction ، وما لم يحدث أي خطأ فلن ندخل في الشرط ولذا سيتم تنفيذ دالة Commit لتنفيذ العمليتين واعتمادهما ، أما في حالة حدوث اي خطأ فسنقوم برمي throw Exception والذي ينقلنا مباشرة إلى Catch لنقوم هناك باستدعاء الدالة rollback من اجل الغاء جميع التأثيرات التي حدثت .
لو كنت تود تجربة هذا المثال لمعرفة كيفية حدوثة ، جرب جعل قيمة throwEx=true وجرب ما يحدث .
لو جربت مثالك الآن ستجد ان قيمة مبلغ العميل 1 مثلاً لم تتأثر ، أما في حالة عدم وجود خطأ في الجملة الثانية فستجد ان الكمية المحددة من المبلغ قد تم نقلها من عميل 1 إلى عميل 2 .
*** طبعاً في تطبيقاتك الجدية لن يكون نظام الايداع والصرف بهذا الشكل ، بل في العادة سيكون هناك جدول او اكثر من جدول يحتوي على العمليات المجراه لكل عميل من ايداع وصرف وسحب وخلافه .
إلى هنا نكون قد انتهينا من دروس هذا اليوم من أجل ADO.net والوضع المتصل ، في الدرس القادم سوف نتعرف سوية بإذن الله على الوضع المنفصل قبل ان يكون درسنا الأخير في عالم قواعد البيانات من أجل مبادئ LINQ .
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته ...
