Entity framework 使用实体框架6事务

Entity framework 使用实体框架6事务,entity-framework,transactions,azure-sql-database,Entity Framework,Transactions,Azure Sql Database,我有一系列关于EF 6中交易使用的问题。我使用以下代码模板进行数据库查询: using (var ctx = new MyContext(connectionString)) { using (var tx = ctx.Database.BeginTransaction(IsolationLevel.Snapshot)) { try { // query database ctx.

我有一系列关于EF 6中交易使用的问题。我使用以下代码模板进行数据库查询:

using (var ctx = new MyContext(connectionString))
{
    using (var tx = ctx.Database.BeginTransaction(IsolationLevel.Snapshot))
    {
          try
          {
               // query database
               ctx.SaveChanges();
               tx.Commit();
          }
          catch(Exception ex)
          {
               tx.Rollback();

               if(ex is A) // handle A
               if(ex is B) // handle B                   

               throw;
          }
    } 
}
  • 我将只查询数据库一次,只调用
    SaveChanges()
    一次。如果发生异常,是否需要回滚事务

  • 我的一些事务将只读取数据,因此我不会调用
    SaveChanges()
    。在这种情况下,我是否仍应调用
    Commit()

  • 我正在考虑使用
    SqlAzureExecutionStrategy
    实现连接弹性。在某一点上会发生瞬时故障吗?它是否仅在执行查询或调用
    SaveChanges()
    期间发生?如何初始化
    ctx
    tx
    ,以及调用
    Commit()
    ?它们会导致这样的失败吗

  • 是否有一种不那么紧凑的方式来查询事务内部的数据库?对于每个查询,我都需要使用上面的代码模板,它显著地复制了代码,例如两个using语句、try-catch块和通用异常处理。我相信最后一个可以通过派生
    SqlAzureExecutionStrategy
    DbExecutionStrategy
    来实现。我完全支持尽可能多地重构代码


您不必在实体框架中实际使用事务。

默认的隔离模式是读取提交模式,完全适合99%的需要,例如读取数据。当您希望保存对数据库所做的更改(创建、更新、删除)时,EntityFramework足够智能,可以创建事务,而无需您在幕后通知您如何包装更改。您可以确保所有内容都将被保存,或者所有更改都将被丢弃(原子性)

看这里

  • 当您调用SaveChanges时,我相信实体框架将在单个事务中执行所有这些操作。当执行时,它会自动回滚。因此,您不必调用回滚。或者使用事务
  • 实体框架在内部处理事务,当您必须在多个数据库上执行操作时,可以使用它
  • 我不知道连接弹性的这个
    SqlAzureExecutionStrategy
    。但是,.NETFramework 4.5.1中新的ADO.Net空闲连接弹性补充了此功能
基本实体框架操作块

using (var context = new ProductContext()) 
{ 
    try
    {
        // Perform data access using the context 
        context.SaveChanges();
    }
    catch(Exception ex)
    {
        //handle exception
    }

}

希望它能帮助您度过愉快的一天。

我知道EF提供的默认事务不能防止不可重复的读取和幻影行。也可能存在需要在更广泛的事务中包含多个
context.SaveChanges()