NHibernate لا رمي StaleObjectStateException عندما <صفحة> المستخدمة وتغيير البيانات في قاعدة بيانات

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

سؤال

ولدي كيان معين في NHibernate مع التحكم التوافق الأمثل باستخدام عمود SQL الطابع الزمني كما رقم الإصدار. تعيين هو كما يلي:

<class name="Entity" optimistic-lock="version" discriminator-value="0">
    <id name="id">
        <generator class="native" />
    </id>
    <version name="Version" column="Version" generated="always" unsaved-value="null" type="System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    ...
    <subclass name="ChildEntity" discriminator-value="1" />
</class>

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

وكما كان متوقعا، تمكن NHibernate التحديث لا تحدث في الصف معين (وهذا أمر جيد). ومع ذلك، يتم طرح استثناء أثناء ارتكاب. كنت أتوقع أن يحدث StaleObjectStateException عندما تم تسليم المعاملة كي أتمكن من استرجاع المعاملة وإعلام المستخدم. أليس هذا هو السلوك المتوقع؟ أنا شيء مفقود؟

وبلدي رمز لتنفيذ المعاملة يبدو شيئا من هذا القبيل:

_session.BeginTransaction();
...
// load objects in session
IList<ChildEntity> toChange = _session.Find('some condition');
foreach ( var itemToChange in toChange )
{
     itemToChange.Status = Status.Updated;
}
...
_session.Transaction.Commit();

ووعناصر تنتمي لنفس الدورة وتنتهي جميع الأعمال في معاملة واحدة. ChildEntity هو فئة فرعية من الفئة الأساسية الكيان، الذي لديه تفاؤلا قفل المقرر أن الإصدار.

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

المحلول 2

ويبدو أن بلدي التجارب غير دقيق. في الاختبار، كنت أفعله في الحصول على بعد المعاملة الأخرى يتم تجديد السجل. جعلت هذا التحديث آخر الصف غير مؤهل للتحديث، لذلك تمت محاولة أي تحديث. عندما غيرت اختبار للتأكد التحديث المتنافسة بعد الحصول، ثم ألقيت StaleObjectStateException كما هو متوقع.

وآسف للارتباك.

نصائح أخرى

وكيف حالك تعديل البيانات؟ يتم طرح StaleObjectException فقط عندما يحاول NHibernate لتحديث الصف ورقم الإصدار لم يعد هو نفسه. الأعمدة الأخرى ليست ذات صلة. هل من الممكن أن في الاختبار الخاص بك كنت لا تحديث رقم الإصدار؟

ووالافتراض هو هذا:

وA. العضو A & B الحصول على كائن من قاعدة البيانات مع نسخة = 1

وSQL: SELECT [object] FROM [TABLE] where id = [id] and Version = 1

B. العضو الكائن A التحديثات والذي يتغير الإصدار إلى 2

وSQL: عودة UPDATE [TABLE] SET [object] (& Set Version = 2) where id = [id] and Version = 1 الصف 1 محدثة

وC. يحاول المستخدم B لتحديث الكائن ولكن يحصل StaleObjectException وجوه التحديث مع نسخة = 1 (النسخة حصل ذلك خطوة 1) بتحديث 0 السجلات في قاعدة البيانات.

وSQL: UPDATE [TABLE] SET [object] where id = [id] and Version = 1 بإرجاع الصفوف 0 تجديد وStaleObjectException القيت

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