في أي سطر في الكود التالي ، هل يجب أن ارتكب وحدة عملي؟

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

سؤال

لدي الرمز التالي الموجود في المعاملة. لست متأكدًا من أين/عندما يجب أن أقوم بالارتباط بمجالتي.

عن قصد ، لم أذكر أي نوع من التكرار الذي أستخدمه - على سبيل المثال. LINQ-TO-SQL ، إطار الكيان 4 ، nhibernate ، إلخ.

إذا كان شخص ما يعرف أين ، فهل يمكن أن يوضحوا لماذا قالوا ، أين؟ (أحاول فهم النمط من خلال مثال (مثال) ، بدلاً من مجرد الحصول على الكود الخاص بي).

هذا ما لدي:-

using
(
    TransactionScope transactionScope =
        new TransactionScope
        (
            TransactionScopeOption.RequiresNew,
            new TransactionOptions
                { IsolationLevel = IsolationLevel.ReadUncommitted }
        )
)
{
    _logEntryRepository.InsertOrUpdate(logEntry);
    //_unitOfWork.Commit();  // Here, commit #1 ?

    // Now, if this log entry was a NewConnection or an LostConnection,
    // then we need to make sure we update the ConnectedClients.
    if (logEntry.EventType == EventType.NewConnection)
    {
        _connectedClientRepository.Insert(
            new ConnectedClient { LogEntryId = logEntry.LogEntryId });
        //_unitOfWork.Commit(); // Here, commit #2 ?
    }

    // A (PB) BanKick does _NOT_ register a lost connection,
    // so we need to make sure we handle those scenario's as a LostConnection.
    if (logEntry.EventType == EventType.LostConnection ||
        logEntry.EventType == EventType.BanKick)
    {
        _connectedClientRepository.Delete(
            logEntry.ClientName, logEntry.ClientIpAndPort);
        //_unitOfWork.Commit(); // Here, commit #3 ?
    }

    _unitOfWork.Commit(); // Here, commit #4 ?
    transactionScope.Complete();
}
هل كانت مفيدة؟

المحلول

ارتكب في المرتبة الرابعة بعد جميع العمليات لجميع المستودعات. إذا كنت تلتزم مسبقًا ، فإن التغييرات التي تم إجراؤها بعد تلك المكالمة غير ملتزمة.

نصائح أخرى

نقطة انطلاق جيدة للإجابة على هذا السؤال هي تعريف وحدة العمل من أنماط بنية المؤسسة (http://martinfowler.com/eaacatalog/unitofwork.html ):

يحافظ على قائمة بالكائنات المتأثرة بمعاملة تجارية وتنسيق الكتابة خارج التغييرات وحل مشاكل التزامن.

يتم تعريف حدود وحدة العمل الخاصة بك من خلال حدود معاملة عملك - في هذه الحالة التي هي مرادفة لحدود معاملة قاعدة البيانات (ولكن في حالة معاملة أعمال طويلة المدى تمتد على طلبات متعددة قد لا تكون قضية ).

العمل للخلف من التعريف أعلاه وبناءً على فهمي لرمز الكود ، يجب عليك ارتكاب وحدة العمل في نهاية المعاملة التجارية (#4).

جانبا ، يجب أن تكون نطاقات معاملات قاعدة البيانات الخاصة بك دائمًا أقل من نطاق UOW الخاص بك (أي أن نطاق TX موجود بين الدعوة إلى uow.begin () و uow.commit ()). إذا تمتد UOW الخاصة بك معاملات قاعدة بيانات متعددة ، فستستخدم معاملة تعويض "لإعادة التوازن" في UOW إذا فشلت إحدى المعاملات الداخلية. في هذه الحالة ، وخاصة إذا كانت UOW الخاصة بك تقوم بإنشاء حدود معاملات قاعدة البيانات الخاصة بها على uow.begin () و uow.commit () ، فسأقوم بإزالة نطاق المعاملة لأن هذا هو مجرد إضافة ضوضاء غير ضرورية إلى الكود.

على افتراض أن متجر البيانات الخاص بك يعين معرفات ، يجب عليك الالتزام رقم 1 (مع nhibernate يجب عليك حتى التدفق) ، ثم في النهاية رقم 4.

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