المعاملات nhibernate والمعاملات المتداخلة
-
04-10-2019 - |
سؤال
أعلم أن nhibernate لا يدعم المعاملات المتداخلة.
دعنا نقول أنني حصلت على شيء مثل هذا:
- userService.begintransaction (في الجلسة الحالية)
- userService.save
- userService-> Feedservice
- feedservice.begintransaction (في الجلسة الحالية)
- Feedservice.save
- feedservice.commit (على المعاملة التي تم إرجاعها في #3.1)
- userService-> adventservice
- addressservice.begintransaction (في الجلسة الحالية)
- addressservice.save
- addressService.Commit (على المعاملة التي تم إرجاعها في #4.1)
- userService.Commit (على المعاملة التي تم إرجاعها في #1)
ماذا يحدث عندما يتم الاحتجاج في الالتزام في #3.3 ، هل المعاملة مرتبطة؟ أحتاج إلى كل شيء للنجاح أو الفشل.
المحلول
كما قال جيمي ، يجب إدارة المعاملات على مستوى أعلى لتجنب هذا الموقف.
ومع ذلك ، إذا كنت يجب الحفاظ على البداية/الالتزام على مستوى "الخدمة" لأي سبب من الأسباب ، يمكنك لف كل شيء في TransactionScope
, ، الذي سوف Complete()
فقط بعد كل شيء يزداد.
نصائح أخرى
نعم. لن تفعل مكالمة BeginTransaction في 3.1 أي شيء لأن هناك بالفعل معاملة نشطة. إذا كنت تريد أن تشارك جميع عملياتك في نفس المعاملة ، فلا تستدعي المعاملة BEGIN/END في 3.x و 4.x.
نصيحتي هي عدم استخدام المعاملات في فصول الخدمة أو المستودعات. إما أتحكم في المعاملة على مستوى واجهة المستخدم أو إنشاء فئة تغلف عملية الأعمال.