我有一个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的最佳方式。
答案 0 :(得分:2)
与BeginTransaction()相关的TransactionScope特定于连接。
如果您想跨多个连接(多个数据库,资源)维护一个事务,那么您需要DTC知道TransactionScope。这是一个类似的SO post。您需要使用Oracle.ManagedDataAccessDTC.dll
来促进这一点。
您可能希望浏览以下链接:
2。How To Configure DTC to Support Oracle Transactions
希望这有帮助。