Блок приложения доступа к данным и область транзакций будут разделять объекты базы данных, используя одно и то же соединение - PullRequest
0 голосов
/ 26 мая 2009

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

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

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

Ответы [ 2 ]

3 голосов
/ 26 мая 2009

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

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

А

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

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

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

0 голосов
/ 26 мая 2009

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

...