gpt4 book ai didi

linq-to-sql - Linq 到 SQL 事务范围

转载 作者:行者123 更新时间:2023-12-04 02:33:35 24 4
gpt4 key购买 nike

我有以下场景:

 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();
}
}
}

InvokeInTransaction 调用内部是对 LTS 存储库进行的许多调用,以执行各种数据更改。问题是在存储库内还有另一个
using (var db = new DataContext())

里面是持久化代码。检查存储库中的上下文显示 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.";
    }
    }
    }

    关于linq-to-sql - Linq 到 SQL 事务范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959356/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com