Linq to sql Linq到SQL TransactionScope
我有以下情况:Linq to sql Linq到SQL TransactionScope,linq-to-sql,transactionscope,Linq To Sql,Transactionscope,我有以下情况: using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted },EnterpriseServicesInteropOption.Automatic)) { using (DataContext db = new DataC
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted },EnterpriseServicesInteropOption.Automatic))
{
using (DataContext db = new DataContext())
{
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
try
{
bool outcome = InvokeInTransaction<string, object>(inputDict, out outputDict);
db.Transaction.Commit();
}
catch (Exception ex)
{
response.Outcome = BusinessEntityResponse.SystemError;
db.Transaction.Rollback();
}
}
}
其中是持久性代码。检查存储库中的上下文显示Transaction=null,我怀疑“内部”上下文不知道环境事务。这能做到吗?我知道EF是秘密管理的,限制是存储库代码不能更改。有什么帮助吗?我们使用LinqToSql和TransactionScope处理多个数据库事务。如果要尝试连接/上下文/事务,您应该真正控制它的生命周期
- 我们通过以下规则控制DataContext实例:如果您创建了一个新实例,那么您可以使用using语句来实现这一点
- 我们通过以下规则控制连接生命周期:如果打开连接,则必须关闭连接(但通常由DataContext实例管理)
- 我们通过以下规则控制事务生命周期:让DataContext管理SubmitChanges中发生的事情,让TransactionScope管理其using块中发生的事情
using (OuterDataContext outerDataContext = GetOuterDataContext())
{
using (InnerDataContext innerDataContext = GetInnerDataContext())
{
try
{
OuterRepository outerRepository = new OuterRepository();
// may read records into memory for updating/deleting.
outerRepository.WorkWithOuterRecords(outerRecords, outerDataContext);
InnerRepository innerRepository = new InnerRepository();
// may read records into memory for updating/deleting.
innerRepository.WorkWithInnerRecords(innerRecords, innerDataContext);
using (TransactionScope scope = new TransactionScope())
{
//starts a local tranaction in outerDB, held open by scope
outerDataContext.SubmitChanges();
//promotes the transaction to distributed, still held open by scope
innerDataContext.SubmitChanges();
// and done
scope.Complete();
}
}
catch (Exception ex)
{
LoggerClient.Log(ex);
response.Message = "It didn't save anything.";
}
}
}
感谢David,这个模式看起来确实是一个很好的实现,我喜欢使用*记录作为维护上下文范围的一种手段,我只是无法绕过存储库类的brown字段实现(对这些类的调用方进行了太多重构)。这就是原来的问题。不过图案不错。。
using (OuterDataContext outerDataContext = GetOuterDataContext())
{
using (InnerDataContext innerDataContext = GetInnerDataContext())
{
try
{
OuterRepository outerRepository = new OuterRepository();
// may read records into memory for updating/deleting.
outerRepository.WorkWithOuterRecords(outerRecords, outerDataContext);
InnerRepository innerRepository = new InnerRepository();
// may read records into memory for updating/deleting.
innerRepository.WorkWithInnerRecords(innerRecords, innerDataContext);
using (TransactionScope scope = new TransactionScope())
{
//starts a local tranaction in outerDB, held open by scope
outerDataContext.SubmitChanges();
//promotes the transaction to distributed, still held open by scope
innerDataContext.SubmitChanges();
// and done
scope.Complete();
}
}
catch (Exception ex)
{
LoggerClient.Log(ex);
response.Message = "It didn't save anything.";
}
}
}