سؤال

وأنا أتساءل فقط كيفية التعامل مع أفضل صفقة في طبقات خدمة متعددة. طبقات خدمة استخدام ORM لتخزين واسترداد من قاعدة البيانات. ينبغي أن يكون معروفا في المعاملات والتعامل معها ضمن طبقات الخدمة الفردية؟ أو ينبغي أن يتم التعامل معها من قبل طبقة أخرى؟

وعلى سبيل المثال: لدي طبقتين خدمة للمستخدمين والعملاء. وأود أن:

1) إنشاء وحفظ عميل جديد
2) إنشاء وحفظ المستخدم
جديد 3) تعيين هذا المستخدم إلى العميل

وجميع ضمن صفقة واحدة.

وهناك مثال بسيط قد تبدو هذه:

$userManagementService = new UserManagementService;
$newUserData = array(...);
$newUser = $userManagementService->create($newUserData);

$clientManagementService = new ClientManagementService;
$newClientData = array(...);
$newClient = $clientManagementService->create($newClientData);

$userManagementService->assignUserToClient($newUser, $newClient);

وأين يجب أن تذهب منطق الصفقة؟

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

المحلول

لا تحاول أن تفعل المعاملات المتداخلة ضمن طبقات الخدمة أو داخل مكتب إدارة السجلات.

والمعاملات عالمية للاتصال DB. ما لم يدعم RDBMS الخاص بك المعاملات المتداخلة أصلا و API DB الخاص بك يعرض المعاملات المتداخلة، يمكنك تشغيل إلى الشذوذ.

لمزيد من التفاصيل، انظر جوابي على كيف كشف تم بالفعل بدأت تلك المعاملة؟

ومنذ كنت تستخدم PHP، في نطاق المعاملات الخاص بك هو على الأكثر طلب واحد. لذلك ينبغي عليك فقط استخدام المعاملات الحاويات التي تديرها، وليس خدمة طبقة TRANSA. وهذا هو، تبدأ الصفقة في بداية التعامل مع الطلب، والالتزام (أو العودة)، والانتهاء من معالجة الطلب.

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

نصائح أخرى

هل تواجه تجميع المعاملات؟ هل هذه المباراة رمز زائف ما أعتقد تقوله؟

try
    begin application transaction
    begin ORM transaction 1
       create new user
       commit request
    begin ORM transaction 2
       create new client
       commit request
    begin ORM transaction 3
       create user client association
       commit request
    commit application tx
catch()
    abort ORM tx 3
    abort ORM tx 2
    abort ORM tx 1
    abort app tx

وعند أي نقطة سوف التراجع عن معاملة متداخلة المرجح بطرح استثناء، وأن تلك الاستثناءات لفة منطقيا عودة جميع المعاملات المتداخلة في في مرحلتين ارتكاب .

وأنا قد لا يكون الحصول على ما كنت بعد ثو.

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