سؤال

عند مرة شخص ما موقع الويب الخاص بي، وقال انه راجع صفحة مع أقل عدد من مرات مشاهدة الصفحات. يتم تخزين كافة الصفحات، بما في ذلك عداد مشاهدة صفحة، في قاعدة بيانات MYSQL. إذا كانت صفحة وينظر، يتم زيادة العداد مشاهدة صفحة تلو الآخر.

وأركض الآن في حالة سباق إذا كان لي خادم لديها اكثر من موضوع واحد:

<اقتباس فقرة>   

والموضوع 1: المستخدم أ يستعيد الصفحة P مع عدد مشاهدة صفحة 10
  الموضوع 2: الصفحة retreives B العضو P مع عدد مشاهدة صفحة 10
  الموضوع 1: يتم زيادة عدد مشاهدات صفحات الصفحة P 10-11 وحفظ
  الموضوع 2: يتم زيادة عدد مشاهدات صفحات الصفحة P 10-11 وحفظ

وهكذا في النهاية، تم عرض الصفحة مرتين، ولكن يتم زيادة pagecounter فقط من جانب واحد.

والحل هو قفل الصف باستخدام SELECT ... FOR UPDATE لكن بعد ذلك، المستخدم B أن ينتظر حتى يتم حفظ السجل المستخدم والوصول إلى ومع العديد من المواضيع كل محاولة للحصول على الصفحة مع أقل عدد مشاهدات الصفحات ، سوف يكون هناك تأخير.

على لذا سؤالي: هل هو ممكن عندما يتم تأمين عدد من الصفوف، للحصول على الصف الأول التي لم يتم تأمين، وبالتالي فإن المواضيع لا يجب أن تنتظر كل منهما على الآخر كيفية القيام هذا في MYSQL؟

وأود أن تفضل حلا نتائج البحث في

<اقتباس فقرة>   

والموضوع 1: المستخدم أ تأمين الصفحة P مع عدد مشاهدة صفحة 10
  الموضوع 2: العضو B بتأمين الصفحة Q مع عدد مشاهدة صفحة 11 (بسبب تأمين الصفحة P)
  الموضوع 1: يتم زيادة عدد مشاهدات صفحات الصفحة P 10-11 وحفظ
  الموضوع 2: يتم زيادة عدد مشاهدات صفحات من صفحة Q 11-12 وحفظ

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

المحلول

واعتقد انك تفعل شيئا من هذا القبيل:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

حيث يتم إدراج الثوابت 11 و 30 من التعليمات البرمجية (PHP؟)

وهناك طريقة أفضل هو أن تفعل هذا:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

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

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