سؤال

أنا أستخدم LinQ إلى SQL و SDK طرف ثالث يدعم المعاملات الموزعة. عندما أدرك أن التحديث المعلق سوف يقوم بتحديث كل من سجلات SQL والسجلات في SDK الطرف الثالث، أقوم بإنشاء معاملات مهلة 0 (لا حصر لها) 0 (على الرغم من أنني جربت أيضا 12 ساعة كمعلمة زمنية واحدة). ثم استخدم GetDTCTransaction في المعاملة المحيطة (التي أنشأتها المعاملات) للحصول على معاملة DTC للربط إلى SDK الطرف الثالث. تعمل الأمور بشكل جيد لمدة 10 دقائق تقريبا، ولكن بعد 10 دقائق، تختفي المعاملة ويحدث خطأ. كيف يمكنني تحديد سبب اختفاء المعاملة. أظن أنه مهلة لأنه يحدث بانتظام بعد 10 دقائق على الرغم من أن درجات مختلفة من العمل قد تم في هذه المرحلة. لكنني في خسارة حول كيفية تحديد ما تم إنهاء المعاملة، لماذا، وكيفية تمديد حياتها.

لقد حاولت التتبع الأحداث التالية مع SQL Profiler:

  1. كل الأحداث الخطأ والتحذير
  2. جميع الأحداث الأمنية باستثناء الأحداث "كائن مخطط التدقيق"
  3. جميع أحداث المعاملات باستثناء الأحداث SQLTransaction والتجارة

كل ما أحصل عليه حول وقت الخطأ هما الأحداث:

<Event id="19" name="DTCTransaction">
  <Column id="3" name="DatabaseID">1</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="35" name="DatabaseName">master</Column>
  <Column id="51" name="EventSequence">167065</Column>
  <Column id="12" name="SPID">10</Column>
  <Column id="60" name="IsSystem">1</Column>
  <Column id="1" name="TextData">{D662BBC4-21EC-436D-991C-DCB061A34782}</Column>
  <Column id="21" name="EventSubClass">16</Column>
  <Column id="25" name="IntegerData">0</Column>
  <Column id="41" name="LoginSid">01</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="2" name="BinaryData">C4BB62D6EC216D43991CDCB061A34782</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:32.82-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">sa</Column>
  <Column id="31" name="Error">1222</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167066</Column>
  <Column id="12" name="SPID">19</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="60" name="IsSystem">1</Column>
  <Column id="1" name="TextData">Error: 1222, Severity: 16, State: 18</Column>
  <Column id="41" name="LoginSid">01</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:34.717-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">18</Column>
  <Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
  <Column id="31" name="Error">8525</Column>
  <Column id="8" name="HostName">MARTY755</Column>
  <Column id="12" name="SPID">55</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="64" name="SessionLoginName">fse</Column>
  <Column id="1" name="TextData">Error: 8525, Severity: 16, State: 1</Column>
  <Column id="9" name="ClientProcessID">2516</Column>
  <Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">1</Column>
  <Column id="50" name="XactSequence">236223201284</Column>
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">fse</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167067</Column>
</Event>
<Event id="162" name="User Error Message">
  <Column id="31" name="Error">8525</Column>
  <Column id="8" name="HostName">MARTY755</Column>
  <Column id="12" name="SPID">55</Column>
  <Column id="20" name="Severity">16</Column>
  <Column id="64" name="SessionLoginName">fse</Column>
  <Column id="1" name="TextData">Distributed transaction completed. Either enlist this session in a new transaction or the NULL transaction.</Column>
  <Column id="9" name="ClientProcessID">2516</Column>
  <Column id="41" name="LoginSid">DB2744F54B5CDB4A8B9E5CA9C209A7AC</Column>
  <Column id="49" name="RequestID">0</Column>
  <Column id="10" name="ApplicationName">.Net SqlClient Data Provider</Column>
  <Column id="14" name="StartTime">2009-11-11T13:55:37.54-06:00</Column>
  <Column id="26" name="ServerName">.</Column>
  <Column id="30" name="State">1</Column>
  <Column id="50" name="XactSequence">236223201284</Column>
  <Column id="3" name="DatabaseID">9</Column>
  <Column id="11" name="LoginName">fse</Column>
  <Column id="35" name="DatabaseName">ACS</Column>
  <Column id="51" name="EventSequence">167068</Column>
</Event>

EventsubClass 16 على حدث DTCTransaction يشير إلى "المعاملة إحباط".

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

المحلول

لتمديد المهلة، مما يؤدي إلى أقصى 10 دقائق إلى 10 دقائق غير محددة، من الضروري تحديث C: Windows Microsoft.NET Framework v2.0.50727 Config machine.config على النظام المستهدف (انظر ضمن C: Windows microsoft.net framework64 v2.0727 config إذا كنت تعمل 64 بت). أضف هذا كعنصر آخر مباشرة أسفل مستوى الجذر:

<system.transactions>
    <machineSettings maxTimeout="23:00:00"/>
</system.transactions>

سيقوم هذا (كمثال) تعيين المهلة إلى 23 ساعة.

القيمة الفعالة مرئية في system.transactions.transactionmanager.maximumtimeout

نصائح أخرى

هل يمكن أن يكون توقيت SQLConnection وليس المعاملة الموزعة؟

تحديث 1.

يمكنك استخدام SQL Server Profiler. لمحاولة ومراقبة قطرة اتصال غير متوقعة. سترغب في التأكد من أن ملفك الشخصي لتتبع الأحداث التي تحتاجها لأن إخراجها سوى إخراجها. سأبدأ فقط بمراقبة الأحداث "تسجيل دخول التدقيق" و "تسجيل الخروج" يمكن العثور عليها ضمن فئة الأحداث "الأمان".

إذا كنت تنمذا من أي شيء آخر غير مثيل SQL Server مستقل / بنفسك فقط، فربما تريد تطبيق مرشح، لذلك تظهر الأحداث التي تنشأ فقط من مضيفك في الإخراج.

قد ترغب في صراحة حدد قيمة المهلة في سلسلة الاتصال الخاصة بك - تعيينها منخفضة حقا ومعرفة ما إذا كنت تحصل على نفس السلوك أسرع كثيرا.

تحديث 2.

من سجل التتبع الخاص بك، أرى استثناءتين، تفاصيلها:

  • خطأ: 1222، شدة: 16، الحالة: 18
  • خطأ: 8525، شدة: 16، الدولة: 1

تحولت googling لاستثناء 1222 http://www.sqlservercentral.com/forums/topic579864-146-1.aspx#bm645422., ، التي تنص على:

هذا الخطأ يعني أنه تم طلب قفل في MSDB ومقرهته. عادة، سوف يعني ذلك أنها معاملة كبيرة على طاولة مؤقت كبيرة أو فرز كبير، أو شيء من هذا النوع.

هل لديك أي استفسارات طويلة بشكل خاص قد تكون مرتبطة بها؟ ربما تقرير ثقيل، أو شيء مشابه لذلك؟

نأمل أن هذا يجعلك بعيدا قليلا.

من المحتمل أن يكون هذا واضحا للجميع قراءة ما عداي، لكنني تلقيت للتو في هذه المشكلة وأراد أن أذكر كيف أصلحته. على الرغم من أنني قمت بتعديل الملف في الموقع الذي أشار إليه بواسطة Bluemonkmn، إلا أنني ما زلت أتلقى مهلة المعاملات الافتراضية لمدة 10 دقائق. نظرا لأنني أقوم بتشغيل Windows 7 64 بت، فإن موقع ملف Machine.config ل .NET في الموقع التالي:

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG

ملاحظة مجلد "Framage64" يختلف عن أعلاه.

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