Вы сказали:
Спасибо. но это решение ставит новый вопрос: если область транзакции была изменена, почему операция отправки становится такой трудоемкой? База данных и приложение находятся на одном компьютере
Это потому, что вы создаете новый DataContext прямо здесь:
TransactionLogDataContext transactionDC = new TransactionLogDataContext())
С новым контекстом данных ADO.NET открывает новое соединение (даже если строки соединения одинаковы, если только вы не используете умный пул соединений). В контексте транзакции, когда вы пытаетесь работать с более чем 1 экземпляром подключения (что вы только что сделали), ADO.NET автоматически повышает транзакцию до распределенной транзакции и пытается закрепить ее в MSDTC. Зачисление самой первой транзакции на соединение в MSDTC займет время (у меня это занимает 30+ секунд), однако последовательные транзакции будут быстрыми (в моем случае 60 мс). Взгляните на этот http://support.microsoft.com/Default.aspx?id=922430
Что вы можете сделать, так это повторно использовать транзакцию и строку подключения (если возможно) при создании нового DataContext.
TransactionLogDataContext tempDataContext =
new TransactionLogDataContext(ExistingDataContext.Transaction.Connection);
tempDataContext.Transaction = ExistingDataContext.Transaction;
Где ExistingDataContext — это тот, который начал внешнюю транзакцию.
Или попытайтесь ускорить ваш MS DTC.
Также используйте SQL Profiler, предложенный billb, и найдите SessionId между различными командами (сохраните и сохраните журнал в вашем случае). Если SessionId изменится, вы фактически используете 2 разных соединения, и в этом случае вам придется повторно использовать транзакцию (если вы не хотите, чтобы она повышалась до MS DTC).
person
Ivan
schedule
08.06.2010