سؤال

لقد قرأت أن بعض المشروعات الإنمائية/دباس نوصي باستخدام المعاملات في كل قاعدة بيانات المكالمات حتى للقراءة فقط المكالمات.بينما أنا أفهم إدراج/تحديث ضمن الصفقة ما هي الفائدة من القراءة في الصفقة ؟

هل كانت مفيدة؟

المحلول

وهكذا تحصل على عرض ثابت من قاعدة البيانات. تخيل لديك جدولين التي تصل إلى بعضها البعض، ولكن لسبب ما تفعله 2 يختار ... في pseuodocode:

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

إذا بين الاستعلامات اثنين، شخص ما يغير B لحذف بعض الصفوف، وأنت تسير لدينا مشكلة.

نصائح أخرى

على غرار ما RoBorg قال: كنت لا يختار w/i المعاملات لمنع القراءة الوهمية البيانات بين البيانات. ولكن من المهم أن نلاحظ أن التخلف مستوى عزل المعاملة في SQL Server قراءة المرتكبة والتي سوف يمنع القذرة يقرأ ، لمنع الوهمية البيانات يجب أن تستخدم على الأقل تكرار قراءة."استخدم هذا الخيار فقط عند الضرورة."

http://msdn.microsoft.com/en-us/library/ms173763.aspx

ولقد وجدت أن تتصرف "المعاملات" بشكل مختلف جدا على خوادم SQL مختلفة. في بعض الحالات، بدءا صفقة تأمين كافة الاتصالات الأخرى من أن تكون قادرة على تنفيذ أي SQL حتى يتم تنفيذ العملية أو التراجع (MS سيكلسرفير 6.5). آخرون ليس لديهم أي مشاكل، وقفل فقط عندما يكون هناك تعديل (أوراكل). يمكن للأقفال حتى تتوسع لتشمل فقط التغييرات - أقفال خلية / اغلاقات / تأمين الصفحة / تأمين الجدول

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

استخدم معاملة إذا كنت يمكن التنبؤ الحالة التي تكون فيها كنت تريد التراجع عن التعديلات متعددة، ولكن على خلاف ذلك، فإن قاعدة البيانات تفعل ذلك من التحديثات الذرية دون رمز إضافي للتعامل معها.

ولقد تم التحقق من ذلك في الدقائق القليلة الماضية، لأنه شيء أود أن أعرف المزيد عنها. وإليك ما وجدتها.

سوف

والمعاملات تكون مفيدة حول اختيار إذا كنت ترغب في قفل هذا الصف في حين أن الشخص هو قراءة السجلات ولا تريد أن تعديل أو قراءة. على سبيل المثال تشغيل هذه الاستعلامات:

و(في إطار الاستعلام 1)

وBEGIN TRAN SELECT * FROM MYTABLE مع (ROWLOCK XLOCK) WHERE ID = 1

و(في إطار الاستعلام 2)

وSELECT * FROM MYTABLE WHERE ID = 1

و(إطار الاستعلام 2 لن تعود النتائج حتى تقوم بتشغيل هذه في نافذة 1)

وارتكاب TRAN

والروابط المفيدة:

http://msdn.microsoft.com/en-us/library /aa213039.aspx

http://msdn.microsoft.com/en-us/library /aa213026.aspx

http://msdn.microsoft.com/en-us/library /ms190345.aspx

وكان هدفي هو الحصول على شيء لمنع - وعملت أخيرا بعد إضافة XLOCK هناك. ببساطة عن طريق استخدام ROWLOCK لم يكن يعمل. أفترض أنها ستصدر تأمين مشتركة (وكان قد تم قراءة البيانات) .. ولكن ما زلت استكشاف هذا.

وإضافة - مع (UPDLOCK ROWLOCK) - سوف تمكنك من اختيار وقفل الصفوف إلى التحديثات التي من شأنها أن تساعد مع التزامن.

كن حذرا مع تلميحات الجدول. إذا كنت بدء تطبيقها بشكل عشوائي، النظام الخاص بك سيتباطأ الى الزحف اذا كان لديك حتى عدد قليل من المستخدمين في التطبيق الخاص بك. وهذا هو الشيء الوحيد الذي كنت أعرف قبل النظر في ذلك؛)

وأود أن أقول أن أحد الأهداف الرئيسية للصفقة هو تقديم إمكانية العودة إلى الحالة السابقة إذا كان هناك أي problems- وهي ميتة عند قراءة ببساطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top