سؤال

هل هذا يسبب حالة سباق مع MySQL (InnoDB):

  1. بدء المعاملة.

  2. محاولة للحصول على سجل.

  3. إذا كان السجل غير موجود، والعودة.

  4. في حالة وجود سجل، احذفه وإضافة إدخال سجل قول تم حذفه.

  5. نهاية المعاملة (الالتزام / التراجع).

هل من الممكن أن تبدأ عملية أخرى قبل حذف خطوة حذف في 2B، والكشف عن وجود السجل ثم لديك كلا العمليات تدخل الإدخالات حذف العنصر في السجل؟

هل هناك أي احتياطات أحتاج إلى اتخاذها؟

شكرا.

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

المحلول

استخدم "تحديد لتحديث" في الخطوة 2. سيتمكن عملية واحدة فقط من الحصول على قفل على الصف وبالتالي تجنب السيناريو الذي وصفته.

نصائح أخرى

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

بدء المعاملة.

حذف السجل / * باستخدام نفس المعايير التي تستخدمها "حاول الحصول على تسجيل" * /

إذا تشير الاستجابة إلى سجل تم حذفه بالفعل، أضف إدخال سجل.

نهاية المعاملة (الالتزام / التراجع).

لا مزيد من حالة السباق.

نعم، من الممكن إجراء معاملة أخرى للتحقق من الجدول بعد قراءتها.

والأسوأ من ذلك، بسبب كيفية عمل المعاملات، حتى بعد حذف الصف، فإن أي معاملات جديدة تبدأ سترى الصف لأنك لم تلتزم حذفها بعد.

SELECT ... FOR UPDATE هي طريقة واحدة لمنع ذلك.

LOCK TABLE tablename هو آخر.

لسوء الحظ، نظرا لأنك تستخدم orm، لم أستطع أن أقول ما إذا كان لديه القدرة على القيام بأي من هذه.

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