سؤال

أعلم أن nhibernate لا يدعم المعاملات المتداخلة.

دعنا نقول أنني حصلت على شيء مثل هذا:

  1. userService.begintransaction (في الجلسة الحالية)
  2. userService.save
  3. userService-> Feedservice
    1. feedservice.begintransaction (في الجلسة الحالية)
    2. Feedservice.save
    3. feedservice.commit (على المعاملة التي تم إرجاعها في #3.1)
  4. userService-> adventservice
    1. addressservice.begintransaction (في الجلسة الحالية)
    2. addressservice.save
    3. addressService.Commit (على المعاملة التي تم إرجاعها في #4.1)
  5. userService.Commit (على المعاملة التي تم إرجاعها في #1)

ماذا يحدث عندما يتم الاحتجاج في الالتزام في #3.3 ، هل المعاملة مرتبطة؟ أحتاج إلى كل شيء للنجاح أو الفشل.

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

المحلول

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

ومع ذلك ، إذا كنت يجب الحفاظ على البداية/الالتزام على مستوى "الخدمة" لأي سبب من الأسباب ، يمكنك لف كل شيء في TransactionScope, ، الذي سوف Complete() فقط بعد كل شيء يزداد.

نصائح أخرى

نعم. لن تفعل مكالمة BeginTransaction في 3.1 أي شيء لأن هناك بالفعل معاملة نشطة. إذا كنت تريد أن تشارك جميع عملياتك في نفس المعاملة ، فلا تستدعي المعاملة BEGIN/END في 3.x و 4.x.

نصيحتي هي عدم استخدام المعاملات في فصول الخدمة أو المستودعات. إما أتحكم في المعاملة على مستوى واجهة المستخدم أو إنشاء فئة تغلف عملية الأعمال.

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