正确使用DbConnection,DbTransaction与连接池,transactionScope和依赖注入?

时间:2015-08-18 14:43:55

标签: dependency-injection repository-pattern transactionscope system.data system.data.oracleclient

我有一个Oracle数据库,我正在使用Oracle.ManagedDataAccess

在某些情况下,我需要在单个交易中执行操作,但通常不需要。

我不确定在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的最佳方式。

1 个答案:

答案 0 :(得分:2)

与BeginTransaction()相关的TransactionScope特定于连接。 如果您想跨多个连接(多个数据库,资源)维护一个事务,那么您需要DTC知道TransactionScope。这是一个类似的SO post。您需要使用Oracle.ManagedDataAccessDTC.dll来促进这一点。

您可能希望浏览以下链接:

1。All about transactionscope

2。How To Configure DTC to Support Oracle Transactions

希望这有帮助。