سؤال

كنت أبحث في قضايا التزامن المحتملة في DB لذلك ذهبت للقراءة. وجدت http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp؟topic=/com.ibm.db2.udb.doc/admin/c0005267.htm ويذكر الوصول إلى البيانات غير الملتزم.

الوصول إلى البيانات غير الملتزم. قد يقوم التطبيق A بتحديث قيمة في قاعدة البيانات ، وقد يقرأ التطبيق B تلك القيمة قبل ارتكابها. ثم ، إذا لم يتم ارتكاب قيمة A في وقت لاحق ، ولكن تراجعت ، فإن الحسابات التي أجراها B تستند إلى بيانات غير ملتزم (ويفترض أنها غير صالحة).

ماذا ... اعتقدت أن الجلسات الأخرى (نفس التطبيق وحتى نفس الموضوع) يمكن أن تقرأ البيانات التي لم يتم ارتكابها بعد؟ اعتقدت فقط الاتصال/الجلسة (لست متأكدًا من المصطلحات الخاصة بي) التي كتبت البيانات في المعاملة غير الملتزم بها يمكن أن تقرأ بيانات غير ملتزم بها.

هل يمكن لخيوط أخرى قراءة البيانات التي لم يتم ارتكابها؟ أخطط لاستخدام MySQL ولكني قد أستخدم SQLite

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

المحلول

ما هي الجلسات الأخرى التي يمكن أن تقرأها تعتمد على كيفية إعداد قاعدة البيانات الخاصة بك. في MySQL يعتمد أيضًا على محرك قاعدة البيانات الذي تستخدمه. المصطلح الذي تبحث عنه (بشروط ANSI SQL) هو "مستوى العزلة".

سوف تتخلف العديد من قواعد البيانات إلى مستوى العزلة حيث ستحظر القراءة على البيانات غير الملتزم. لذلك ، إذا كانت المعاملة A تحديثات سجل 1234 في الجدول T ثم تحاول المعاملة B تحديد السجل 1234 قبل الالتزام أو اللفات مرة أخرى ، فسيتم حظر B حتى يقوم A بأحد هذه الأشياء.

يرى معاملات MySQL ، الجزء الثاني - مستويات عزل المعاملات.

أحد الجوانب السلبية الجادة من هذا هو أن عمليات تحديث الدُفعات التي تعيش في معاملات طويلة الأجل (عادة) يمكن أن تمنع العديد من الطلبات.

يمكنك أيضًا تعيينها حتى ترى B بيانات غير ملتزم بها ولكن هذا غالبًا ما يكون غير مسبب.

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

MySQL يدعم MVCC.

نصائح أخرى

من المؤكد أنه في SQL Server ، يمكنك اختيار القيام بذلك ، فهذا ليس الافتراضي ، ولكن إذا كنت تستخدم مستوى العزلة الصحيح أو تلميح الاستعلام ، فيمكنك اختيار قراءة صف غير ملتزم ، فقد يؤدي ذلك إلى مشاكل وحتى مزدوجة قراءة من نفس الصف من الناحية النظرية.

يذكر تلك المقالة الوصول إلى البيانات غير الملتزمات كواحدة من المشكلات اقصاء بواسطة مدير قاعدة البيانات.

يتحكم مدير قاعدة البيانات في هذا الوصول لمنع التأثيرات غير المرغوب فيها ، مثل:

...

  • الوصول إلى البيانات غير الملتزم.

يدعم محرك تخزين INNODB من MySQL العديد من مستويات عزل المعاملات. لمزيد من التفاصيل ، انظرhttp://dev.mysql.com/doc/refman/5.4/en/set-transaction.html.

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

لإعطاء محدد ، اعتدت العمل على موقع تجارة إلكتروني كبير جدًا. لقد استخدموا قراءة غير ملتزم في القراءات على كتالوج المتجر ، حيث تم الوصول إلى البيانات بشكل كبير ، وتغييرها بشكل غير متكرر ، وليس حساسًا للمخاوف من قراءة البيانات غير الملتزمات. سيتم إعادة تحديد أي بيانات من الكتالوج الذي تم استخدامه لوضع أمر على أي حال. كان هذا على SQL Server 2000 ، والذي كان من المعروف أن لديه مشاكل في الأداء. في الإصدارات الأحدث من SQL Server ، تم تحسين أداء القفل ، لذلك لن يكون هذا ضروريًا.

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