繁体   English   中英

使用带有ORM(EF6)的自定义UOW的并行事务问题

[英]Parallel transaction issue using custom UOW with ORM(EF6)

我尝试将通用存储库和UOW模式与Entity Framework一起实现为ORM的一些背景知识。我已经使用方法编写了自定义UnitOFWork类

1.BeginTransaction。 2.CommitTransaction 3.RollBackTransaction 4.SaveChanges 5.IsInTransaction 6.Dispose。

public class UnitOfWork: IUnitOfWork
{
  private DbTransaction transaction;
  private readonly DbContext context;
  public UnitOfWork(DBContext dbContext )
  {
    context = dbContext ;
  }   
  public void Begintransaction()
  {
    transaction = context.Database.Connection.BeginTransaction(isolationLevel);
  }
  public void CommitTransaction()
  {
    context.SaveChanges();
    transaction.Commit();
    ReleaseCurrentTransaction();
  }
   ....
   ....
}

我的通用存储库类

public class Repository : IRepository
{
  private dbContext;
  protected DBContext Context
  {
     get
     {
       return dbContext != null? dbContext : dbContext = GetContextFromFactory();
     }
  }
  public void Add<T>(T entity)
  {
    dbContext.Set<T>.Add(entity);
  }
}

我的个人资料库。

public class PersonRepository : Repository
{
  public void AddPerson(Person person)
  {
     using(var uow = new UnitOfWork(Context)
     {
       try
       {
         uow.BeginTransaction();
         Add(person);
         uow.CommitTransaction();
       }
       catch (Exception ex)
       {
         uow.RollBackTransaction();
     log.Error("This Exception:",ex);
       }
     }
  }
} 

var repo = new PersonRepository();
Person person = GetPerson();
repo.AddPerson(person);  

当我运行此代码以保存人员对象时,它将在UOW的CommitTransaction()方法中的context.SaveChanges()上引发异常。 例外是“ SqlConnection不支持并行事务。”

  1. 我在代码中做错了吗?
  2. UOW中的事务有一些问题?
  3. 不支持将UOW事务与ORM结合使用?
  4. 如果不支持事务,那么当DbContext或任何其他ORM默认实现unitofwork模式时,UnityOfWork模式的目的是什么?

非常感谢您的建议和意见。

[更新]我已通过使上下文接受已经存在的当前交易来解决此问题。 我的解决方法是在代码CommitTransaction()中。我需要您的注释。

由此。

  public void CommitTransaction()
  {
   context.SaveChanges();
    transaction.Commit();
    ReleaseCurrentTransaction();
  }

对此。

 public void CommitTransaction()
  {
    context.UseTransaction(this.transaction);
    context.SaveChanges();
    transaction.Commit();
    ReleaseCurrentTransaction();
  }

这种方法有什么缺点吗? 请分享您的评论。

  1. DbContext不是线程安全的-不要在线程之间使用dbcontext。
  2. 连接字符串应确保连接允许MARS。 见下文。
  3. UoW模式是ORM的最佳实践。 由EF支持。
  4. EF框架为您管理交易。 无需在基​​本的存储库类中添加事务处理。
    添加对象1,更改对象2,删除对象3,
    然后SaveChanges。
    将由EF作为交易执行。 没有脏的未提交的读取。 如果更新之一失败,则更改将回滚。
  5. 通过消息队列进行交易。 用于消息队列的EF和事务范围有关何时可能要在EF 中使用事务的一般信息有关使用事务的注意事项以及在EF中的操作方法

  6. 尽快处置上下文实例。 一般建议定期更新

连接字符串:请参见MultipleActiveResultSets = true

 <connectionStrings>
    <add name="myConn" connectionString="Data Source=localhost;Initial Catalog=MyDbName ;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM