سؤال

المشكلة عندي هي:

لدي جدول (مجرد مثال) يحتوي على الحقول التالية:

ID int
Value int

لدي طريقة تسمى BoostByFive () والتي تقوم بما يلي:

method IncreaseByFive(int ID)
{    
    int value = GetValueFromDB(ID);
    value = value + 5;
    SaveValueToDB(value, ID);    
}

ما أريد تجنبه هو الموقف التالي:

  1. يستدعي المستخدم طريقة ويحصل على القيمة (حاليًا 5)
  2. يستدعي المستخدم B الطريقة ويحصل على القيمة (حاليًا 5)
  3. يزيد المستخدم "أ" القيمة بمقدار 5 (الآن 10)
  4. يزيد المستخدم "ب" القيمة بمقدار 5 (الآن 10)
  5. المستخدم أ يحفظ القيمة (10)
  6. يقوم المستخدم ب بحفظ القيمة (10)

الآن أصبح السجل بقيمة 10 بينما كان ينبغي أن يكون 15.

ما أريد فرضه هو ما يلي:

  1. يستدعي المستخدم طريقة ويحصل على القيمة (حاليًا 5)
  2. يستدعي المستخدم "ب" الأسلوب ولكن عليه الانتظار لأن "أ" اتصل به بالفعل.(ديبز!)
  3. يزيد المستخدم "أ" القيمة (الآن 10)
  4. المستخدم ب لا يزال ينتظر
  5. يقوم المستخدم أ بحفظ القيمة (يحتوي السجل على قيمة 10)
  6. يمكن للمستخدم ب الآن قراءة القيمة (10)
  7. يقوم المستخدم ب بزيادة القيمة (15)
  8. يقوم المستخدم ب بحفظ القيمة

الآن تبلغ قيمة السجل 15، وهي النتيجة التي أبحث عنها.

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

أعتقد أيضًا أن أعلى مستوى عزل (قابل للتسلسل) للمعاملة لن يفي بالغرض أيضًا لأنه سيسمح بالقراءة في الخطوة 2 من المثال غير المرغوب فيه أعلاه.

أفترض أن الحل الآخر هو إنشاء جدول القفل الخاص بي وتسجيل الأقفال هناك، ولكن يبدو أن هذا لا ينبغي أن يكون ضروريًا.

أقوم بتطوير هذا المشروع باستخدام C# (3.5) وSQL server 2008.

ماذا يفكر عقل الخلية؟

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

المحلول

ربما أنا زيادةلا تفكر في هذا، ولكن ألا تقوم فقط بلف الكتلة المنطقية بأكملها ..

  • قراءة القيمة
  • كتابة القيمة

في معاملة قاعدة البيانات الخاصة بـ المستوى المناسب؟

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
[ ; ]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top