سؤال

في طلبي ، أستخدم النمط التالي للاتصال بـ DB:

    //do a transaction 
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required))
{
    OperationOnDb1();

    //when we open the connection to the “other db” in this call, the transaction would become distributed
    OperationOnDb2();

    //transaction is now distributed
    transaction.Complete();
}

المشكلة هي أن العملية 1 و OPERATION 2 90 ٪ من الوقت تستخدم نفس DB ... ولكن هناك حالات (الأخطاء) عند استخدام اثنين من DBS. أريد الحصول على استثناء إذا تم توزيع المعاملة.

كيف يمكنني اكتشاف ما إذا تم الترويج للمعاملة إلى معاملة موزعة؟

شكرا ، رادو

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

المحلول

يمكنك أيضًا إلقاء نظرة على الحدث التالي

TransactionManager.DistributedTransActionStarted حدث

نصائح أخرى

ألق نظرة على DistributedTransactionPermissionAttribute. إنه يستخدم DistributedTransactionPermission الفئة wich هي الإذن الذي يطلبه النظام.

يمكنك تطبيقه على قطعة الرمز. يجب إثارة استثناء أمني عند التصعيد.

بينما الخاص بك TransactionScope مستمر ، يمكنك اختبار:

Transaction.Current.TransactionInformation.DistributedIdentifier != default(Guid)

DistributedIdentifier يقال أنه لاغية إذا لم يتم الترويج للمعاملة بعد توزيعها. من وثائقها ، قسم الملاحظات:

إذا تم تصاعد المعاملة إلى معاملة التزام ثنائية المرحلتين ، فإن هذه الخاصية تُرجع معرفها الفريد. إذا لم يتم تصعيد المعاملة ، فالقيمة null.

نظرًا لأن هذه الخاصية ليست قابلة للإلغاء ، فمن الواضح أن هذا خطأ من حيث المبدأ. لكن التحقق مع ILSPY ، هو كذلك Guid.Empty بدلا من ذلك (وهو default(Guid)) عندما لا يتم توزيع المعاملة. (ولكن ربما بعض المعاملة الموزعة غير MSDTC لن تحترم ذلك.)

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