2010-08-27 3 views
5

У меня есть многопоточное приложение C#, где каждый поток имеет собственный набор подключений db. В каждом потоке используется TransactionScope/DTC. Иногда я получаю исключение «Сбой транзакции». Это не от тайм-аута, так как это происходит менее чем за 2 секунды после начала транзакции.Сделка отменена

Вот StackTrace:

на System.Transactions.TransactionStateAborted.BeginCommit (InternalTransaction ТХ, булева asyncCommit, AsyncCallback AsyncCallback, Object asyncState) на System.Transactions.CommittableTransaction.Commit() на System.Transactions.TransactionScope.InternalDispose() на System.Transactions.TransactionScope.Dispose() в MyNamespace.CallingMethod()

Это случается очень редко, скажем один раз в 100 000 транзакций.

Окружающая среда: Windows Server 2003 .Net 2.0 Подключение к SqlServer 2005

Любые идеи о том, почему это встречающийся? Спасибо!

+0

делает SQL, DTC, или OS журналы ошибок имеют какие-либо дополнительные подробности? – StingyJack

+0

любые записи в журналах событий с этой меткой времени? –

+0

Производственная коробка, так что трудно получить любую информацию там без красной ленты. Я посмотрю, смогу ли я получить что-нибудь из журнала событий, это проще. Благодаря! – Dan

ответ

0

Я думаю, что это связано с нестабильностью сети. Это очень редко, и он не поднял его уродливую голову через несколько месяцев.

1

Является ли этот стек вызовов из вашего внутреннего внутреннего Исключения? Я получаю эти исключения, обычно (не всегда, хотя) есть InnerException с дополнительной информацией.

Моя ставка будет в тупике базы данных.

+0

Да, это было самое внутреннее исключение. У меня есть доступ к следам тупиковой ситуации, и никто не был найден за это время. – Dan

1

Вы можете создать дамп памяти, инструкция может быть найдена здесь http://blogs.msdn.com/b/joncole/archive/2007/03/29/creating-a-process-memory-dump.aspx

Затем вы можете проверить с WinDbg, чтобы показать, что это корневое исключение вызвало эту проблему. Существует много полезной информации о том, как использовать windbg для проверки управляемого исключения.

в то же время, вы можете использовать профилировщик sql, чтобы отслеживать, произошла ли какая-либо ошибка sql во время создания исключения.

+0

Мне нравится эта идея. Я собираюсь снова попытаться воссоздать это в dev и получить ответ на эту проблему. – Dan

+0

Если у вас есть дамп памяти, я могу проверить его для вас. вы можете поместить его в общую папку skydrive. –

0

Как сказал Андреас, посмотрите на Внутренние Исключения. Также подключите SQL Profiler и найдите любые взаимоблокировки/завершение.

1

Если кто-либо из вас сталкивается с этой проблемой, обратите внимание, что мне удалось найти решение и проблему. В файле конфигурации приложения отсутствуют свойства для строки подключения, которая была «Enlist».

Ранее строка соединения была = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;" providerName="System.Data.SqlClient" />

Теперь обновленная строка соединения = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;Enlist=False;" providerName="System.Data.SqlClient" />

Смежные вопросы