4

У меня есть база данных Oracle, и я использую Oracle.ManagedDataAccess.Правильный способ использования DbConnection, DbTransaction с пулом соединений, транзакцией и инъекцией зависимости?

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

Я не уверен, что лучший способ обрабатывать DbConnection объектов в пределах одного TransactionScope.

Я мог бы ввести DbConnection в репозитории, а затем использовать только LifetimePerScope, чтобы убедиться, что все они получают одинаковый экземпляр DbConnection. Но это умный ход, нормально ли это .Open() соединение один раз.

using (var scope = _lifetimeScope.BeginLifetimeScope()) 
{ 
    var connection = scope.Resolve<IDbConnection>(); 
    var personRepo = scope.Resolve<IPersonRepository>(); 
    var workRepo = scope.Resolve<IWorkRepository>(); 
    connection.Open(); 
    var transaction = connection.BeginTransaction() 
    personRepo.DeleteById(someId); 
    workRepo.DeleteByPersonId(someId); 
    transaction.Commit(); 
} 

Это заставит меня всегда использовать LifetimeScope, даже если не использовать транзакции, и открыть соединение вне метода хранилища.

Являются ли TransactionScopes зависимыми от одного соединения или я могу открыть несколько подключений (как обрабатывает connectionPool, когда транзакция открыта?) В рамках одной и той же транзакции?

Я полный аутсайдер для DbConnections и все такое, чтобы я мог совершенно не понимать, как использовать TransactionScope и DbConnections.

ответ

3

Возможный дубликат:. Why always close Database connection?

Поскольку это имеет щедрость, я не могу отметить его как дубликат :(

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

Сделки связаны с конкретной открытой связи и должны быть завершены при закрытии соединения.

2

TransactionScope, связанные с BeginTransaction() является зр к соединению. Если вы хотите поддерживать транзакцию по нескольким соединениям (несколько БД, ресурсов), то вам нужно DTC известно TransactionScope. Вот аналогичный SO post. Для этого вам необходимо использовать Oracle.ManagedDataAccessDTC.dll.

Вы можете пройти через эти ссылки:

1. All about transactionscope

2. How To Configure DTC to Support Oracle Transactions

Надеется, что это помогает.