كيف استخدمنا SKIP LOCKED، والمفاتيح الأساسية المركبة، وإمكانية رؤية الاتصال لتحقيق أهدافنا على نطاق واسع.
أثناء الخروج، عندما ينقر المشتري على "إكمال الشراء"، نحتاج إلى ضمان أن العناصر التي يشتريها لا تزال متاحة. إذا أخطأنا في هذا الاتجاه، فسيشتري اثنان من المشترين نفس الوحدة الأخيرة: يتعين على التاجر إلغاء الطلب، وإرسال رسالة اعتذار عبر البريد الإلكتروني، وتحمل تكلفة الدعم. إذا أخطأنا في الاتجاه الآخر، فإننا نخبر المشتري أن شيئًا ما قد تم بيعه عندما لا يكون كذلك، ويخسر التاجر عملية البيع التي كان ينبغي عليه إجراؤها.
على نطاق Shopify، يتفاقم أي فشل بسرعة. في الجمعة السوداء 2025، حقق التجار على منصتنا رقمًا قياسيًا قدره 5.1 مليون دولار من المبيعات في الدقيقة في ذروة المبيعات. كل واحدة من هذه المعاملات تمس المخزون.
يتعامل نظام الحماية من الإفراط في البيع لدينا مع هذا الأمر عن طريق حجز المخزون أثناء معالجة الدفع، وهو احتجاز قصير يمنع عمليتي دفع متزامنتين من المطالبة بنفس الوحدة. لسنوات، كان هذا يعمل على Redis. عندما انتقلنا نحو استراتيجية قاعدة بيانات موحدة، كان علينا الإجابة على سؤال صعب: هل يمكن لـ MySQL التعامل مع نفس النطاق؟
وكانت المحاولات السابقة قد باءت بالفشل. لا يمكن لصف واحد بعمود الكمية التعامل مع التنافس. قدمت ميزة تخطي القفل في MySQL 8 تصميمًا مختلفًا: صف واحد لكل وحدة مخزون بدلاً من صف واحد لكل عنصر. مستوحاة من نهج 37signals لتوزيع التحميل المدعوم بقاعدة البيانات، قمنا بإعادة بناء الحجوزات على MySQL وحققنا أهدافنا عالية الإنتاجية خلال ذروة حركة المرور في عام 2025.
لكن الدرس الأصعب لم يكن يتعلق بتصميم قاعدة البيانات. لقد كان اكتشاف أن عنق الزجاجة الحقيقي لم يكن ما كنا نلاحظه ونقيسه. يشرح هذا المنشور الحل وما وجدناه على طول الطريق.