زيادات قيمة هوية المفتاح الأساسي على انتهاك قيود المفاتيح الفريدة
-
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.
- يتم استخدام IDS 1 ، 2 ، 3 ، 4 ، 5.
- العميل A يبدأ المعاملة.
- العميل A يقوم بإدراج ولكن لا يرتكب (المعرف 6).
- العميل ب يبدأ المعاملة.
- العميل ب ينفذ إدراج لكنه لا يرتكب. (معرف 7).
- العميل لفة مرة أخرى.
- العميل ب الالتزام.
نظرًا لإمكانية (وليس بالضرورة وجود) هذا السلوك ، ترى أن المعرف 6 يتم تخطيه عندما يفشل هذا الإدراج.