Dependency injection 使用DbConnection、带连接池的DbTransaction、transactionScope和依赖项注入的正确方法?
我有一个Oracle数据库,正在使用Dependency injection 使用DbConnection、带连接池的DbTransaction、transactionScope和依赖项注入的正确方法?,dependency-injection,repository-pattern,transactionscope,system.data,system.data.oracleclient,Dependency Injection,Repository Pattern,Transactionscope,System.data,System.data.oracleclient,我有一个Oracle数据库,正在使用Oracle.ManagedDataAccess 在某些情况下,我需要在单个事务中执行操作,但通常不需要 我不确定在单个TransactionScope中处理DbConnection对象的最佳方法是什么 我可以将一个DbConnection注入存储库,然后甚至使用LifetimePerScope来确保它们都获得相同的DbConnection实例。但是,这是一个明智的举动吗?.Open()连接一次可以吗 using (var scope = _lifetimeS
Oracle.ManagedDataAccess
在某些情况下,我需要在单个事务中执行操作,但通常不需要
我不确定在单个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();
}
使用(var scope=\u lifetimeScope.BeginLifetimeScope())
{
var connection=scope.Resolve();
var personRepo=scope.Resolve();
var workRepo=scope.Resolve();
connection.Open();
var transaction=connection.BeginTransaction()
personRepo.DeleteById(someId);
workRepo.DeleteByPersonId(someId);
Commit();
}
这将迫使我始终使用LifetimeScope
,即使不使用事务,也要在存储库方法之外打开连接
TransactionScope是否依赖于单个连接,或者我是否可以在同一事务中打开多个连接(当事务打开时,connectionPool如何处理这些连接?)
我完全不了解数据库连接以及所有这些,因此我可能完全误解了使用TransactionScope和数据库连接的最佳方式。可能重复:
既然这有赏金,我不能把它标为复制品:(
无论如何,连接池主要是为您完成的。您应该尽快关闭连接,将它们返回到池中
事务与特定打开的连接相关,应在关闭连接时完成。与BeginTransaction()相关的事务范围特定于连接。 如果要跨多个连接(多个数据库、资源)维护事务,则需要aware。下面是一个类似的示例。您需要使用
Oracle.ManagedDataAccessDTC.dll
来实现这一点
您可能需要浏览以下链接:
一,
二,
希望这有帮助