زيادات قيمة هوية المفتاح الأساسي على انتهاك قيود المفاتيح الفريدة

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

  •  22-09-2019
  •  | 
  •  

سؤال

لديّ جدول SQLServer 2008 يحتوي على مفتاح أساسي (IsIdentity = نعم) وثلاثة حقول أخرى تشكل قيدًا مفتاحًا فريدًا.

بالإضافة إلى ذلك ، لدي إجراء متجر يقوم بإدراج سجل في الجدول وأتصل بـ Sproc عبر C# باستخدام كائن SQLConnection.

تعمل مكالمة C# Sproc بشكل جيد ، ومع ذلك لاحظت نتائج مثيرة للاهتمام عندما تنتهك مكالمة C# Sproc القيد الرئيسي الفريد ....

عندما تنتهك مكالمة Sproc القيد الرئيسي الفريد ، يتم طرح sqlexception - وهو أمر غير مفاجئ وبارد. ومع ذلك ، لاحظت أن السجل التالي الذي يتم إضافته بنجاح إلى الجدول له قيمة PK ليست أكثر من السجل السابق -

على سبيل المثال: قل أن الجدول يحتوي على خمسة سجلات حيث تكون قيم PK 1،2،3،4 ، و 5. المحاولات Sproc لإدراج سجل سادس ، لكن القيد الرئيسي الفريد ينتهك ، وهكذا ، السجل السادس ليس إدراج. ثم يحاول Sproc إدراج سجل آخر وهذه المرة ناجحة. - يتم إعطاء هذا السجل الجديد قيمة PK 7 بدلاً من 6.

هل هذا السلوك الطبيعي؟ إذا كان الأمر كذلك ، هل يمكنك أن تعطيني سببًا لسبب هذا؟ (إذا فشل السجل في الإدراج ، فلماذا يتم زيادة مؤشر PK؟)

إذا لم يكن هذا سلوكًا طبيعيًا ، فهل يمكنك أن تعطيني أي تلميحات حول سبب رؤية هذه الأعراض؟

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

المحلول

نعم ، هذا طبيعي.

تخيل المعاملات الجارية هنا ، وهذا أمر محتمل للعمليات يعمل على SQL Server.

  1. يتم استخدام IDS 1 ، 2 ، 3 ، 4 ، 5.
  2. العميل A يبدأ المعاملة.
  3. العميل A يقوم بإدراج ولكن لا يرتكب (المعرف 6).
  4. العميل ب يبدأ المعاملة.
  5. العميل ب ينفذ إدراج لكنه لا يرتكب. (معرف 7).
  6. العميل لفة مرة أخرى.
  7. العميل ب الالتزام.

نظرًا لإمكانية (وليس بالضرورة وجود) هذا السلوك ، ترى أن المعرف 6 يتم تخطيه عندما يفشل هذا الإدراج.

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