Блок приложения доступа к данным и область транзакций будут разделять объекты базы данных, используя одно и то же соединение

Я использую область System.Transactions и Transaction для обработки транзакций в сочетании с прикладным блоком доступа к данным Enterprise Library.

В некоторых случаях я использую отдельные экземпляры класса Database в транзакции. Соединение с той же базой данных, хотя.

Мне интересно, будет ли блок приложения повторно использовать то же соединение и не охватывать распределенную транзакцию в этом случае?

2 ответа

Решение

В двух словах, MSDN имеет ваш ответ:

"Корпоративная библиотека, с другой стороны, обычно открывает и закрывает соединение для каждого запроса. Этот подход несовместим с тем, как работает класс TransactionScope. Если имеется несколько соединений, класс TransactionScope считает транзакцию распределенной транзакцией. Распределенная транзакции имеют значительную производительность и ресурсы по сравнению с локальной транзакцией ". (MSDN)

А также

"Чтобы избежать этого, методы класса Database, такие как ExecuteDataSet, распознают, когда экземпляр TransactionScope активен, и подключают вызовы базы данных в этой транзакции. Если транзакция активна в настоящее время в результате использования экземпляра TransactionScope, методы класса Database используют одно соединение." (MSDN)

Вы не упоминаете, какую базу данных вы используете. В клиенте Oracle 10g, который я использовал, это был тот случай, когда вы использовали TransactionScope, у вас всегда была бы распределенная транзакция. Похоже, что эта проблема решена в более поздних выпусках.

Вы можете проверить ответ, посмотрев в разделе " Статистика транзакций".

TransactionScope это очень странный зверь. По моему опыту, транзакция БД переводится в распределенную, как только открывается другое соединение (даже с той же БД).

Другие вопросы по тегам