.NET اكتشف المعاملة الموزعة
-
28-09-2019 - |
سؤال
في طلبي ، أستخدم النمط التالي للاتصال بـ 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. أريد الحصول على استثناء إذا تم توزيع المعاملة.
كيف يمكنني اكتشاف ما إذا تم الترويج للمعاملة إلى معاملة موزعة؟
شكرا ، رادو
المحلول
يمكنك أيضًا إلقاء نظرة على الحدث التالي
نصائح أخرى
ألق نظرة على DistributedTransactionPermissionAttribute
. إنه يستخدم DistributedTransactionPermission
الفئة wich هي الإذن الذي يطلبه النظام.
يمكنك تطبيقه على قطعة الرمز. يجب إثارة استثناء أمني عند التصعيد.
بينما الخاص بك TransactionScope
مستمر ، يمكنك اختبار:
Transaction.Current.TransactionInformation.DistributedIdentifier != default(Guid)
DistributedIdentifier
يقال أنه لاغية إذا لم يتم الترويج للمعاملة بعد توزيعها. من وثائقها ، قسم الملاحظات:
إذا تم تصاعد المعاملة إلى معاملة التزام ثنائية المرحلتين ، فإن هذه الخاصية تُرجع معرفها الفريد. إذا لم يتم تصعيد المعاملة ، فالقيمة
null
.
نظرًا لأن هذه الخاصية ليست قابلة للإلغاء ، فمن الواضح أن هذا خطأ من حيث المبدأ. لكن التحقق مع ILSPY ، هو كذلك Guid.Empty
بدلا من ذلك (وهو default(Guid)
) عندما لا يتم توزيع المعاملة. (ولكن ربما بعض المعاملة الموزعة غير MSDTC لن تحترم ذلك.)