هل يجب أن أقفل جدول ISAM لإدراج قيمة في حقل مفتاح فريد؟

StackOverflow https://stackoverflow.com/questions/169459

  •  05-07-2019
  •  | 
  •  

سؤال

لدي جدول ISAm في mySql تم إنشاؤه بشكل مشابه لما يلي:

create table mytable (
 id int not null auto_increment primary key,
 name varchar(64) not null );

create unique index nameIndex on mytable (name);

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

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

أنا متردد بعض الشيء في استخدام القفل لأنني لا أريد الدخول في موقف مسدود.

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

المحلول

ولا تهتم قفل، والفهرس الخاص بك منع التكرار. يجب التعامل مع رمز الخطأ من التطبيق الخاص بك.

والخلية يجب إرجاع رمز خطأ من 1062 (أو SQLSTATE 23000) عندما يتم انتهاك قيد المفتاح الفريد.

نصائح أخرى

بالطريقة التي وصفت بها الخوف من مواجهة حالة توقف تام، قد لا يكون السبب السببي مفهومًا بوضوح (ما لم يكن هناك ما يستفسر عنه أكثر مما هو موضح في السؤال).

جيد ملخص كتب شخص آخر:

  1. يبدأ الاستعلام 1 بتأمين المورد أ
  2. يبدأ الاستعلام 2 بتأمين المورد B
  3. يحتاج الاستعلام 1، للمتابعة، إلى قفل المورد B، ولكن الاستعلام 2 يقوم بتأمين هذا المورد، لذلك يبدأ الاستعلام 1 في انتظار تحريره
  4. في هذه الأثناء، يحاول الاستعلام 2 الانتهاء، ولكنه يحتاج إلى قفل على المورد A حتى ينتهي، ولكن لا يمكنه الحصول على ذلك لأن الاستعلام 1 لديه القفل عليه.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top