4

我有一個Oracle數據庫,我正在使用Oracle.ManagedDataAccess通過連接池,transactionScope和依賴注入來使用DbConnection,DbTransaction的正確方法?

在某些情況下,我需要在單個交易中執行操作,但通常不會。

我不確定在單個TransactionScope內處理DbConnection對象的最佳方式。

我可以將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?

因爲這有一個賞金,我不能將其標記爲重複:(

無論如何,連接池主要是爲你做了你應該儘快關閉連接你能,將其返回到池中。

交易都涉及到一個特定的打開連接和關閉連接時應該完成。有關的BeginTransaction()