ASP.NET MVC 5 和 EF 6:事务处理的长时间运行进程中的并发处理

问题描述

我正在处理一个现有的多用户 EF6/sql ASP.NET MVC 5 应用程序(数据库优先),该应用程序存在我需要解决的并发问题。数据库包含一对多关系,由“一”和“多”表之间的桥接表表示。

[编辑] 有人指出,在 1 对 M 结构中不需要网桥。我对此很清楚。请参阅下面的评论回复

一张桌子

   OneTableId       (one relationship w BridgeTable)
   .....
   RowVersion       (not yet created)

多桌

   ManyTableId      (many relationship w BridgeTable)
   .....
   RowVersion       (not yet created)

桥表

   BridgeTableRowId
   OneTableId         (relationship w OneTable)
   ManyTableId        (relationship w ManyTable)

一个 One 实体和任意数量的 Many 实体传递到一个长时间运行的进程时,就会建立桥接行,该进程使用 SignalR Hub 上的 QueueBackgroundWorkItem 执行。该过程创建了许多 PDF 并通过电子邮件发送给它们。

桥记录的创建是目前在长时间运行过程中唯一的数据库影响,它是这样启动的:

   using (Entities db = new Entities())
   {
       var oneTableEntity = db.oneTable.SingleOrDefault(s => s.OneTableId == RequestedOneId);
       var manyTableEntities = db.manyTable.Where(s => RequestedIdArray.Contains(s.ManyTableId).ToList();
   }

   HostingEnvironment.QueueBackgroundWorkItem(ct => _DoLongRunningProcess(OneTableEntity,ManyTableEntities).ContinueWith(x =>
   {
       // cleanup and SignalR notifications
   }

LRP(在单独的类中处理)实例化完成其杂务所需的单独数据上下文和数据流(内存和文件)。

系统当前未进行交易,但我正在添加仅在成功创建 PDF 并通过电子邮件发送后才完成的交易。

我需要处理并发性,以便如果用户选择并提交已在长时间运行的进程中处理的 OneTable 或 ManyTable 实体,我们将得到要处理的异常。

问题:

  • 我是否可以简单地在 Bridge 表中的 OneTableId-ManyTableId 列上放置一个唯一约束并捕获该异常,或者我应该实施行版本控制系统吗?我对仅仅让数据库根据唯一索引约束进行投诉持怀疑态度,但不清楚 LRP 对其单独数据上下文的影响。

  • 如果我处理 LRP 以便桥接表行承诺取决于发送的电子邮件,考虑到并发问题,我应该使用什么级别的隔离?

  • 如果我使用行版本控制方法

    1. BridgeTable 记录的分配是否应该触发 EF6 以增加 OneTable 和 ManyTable 中的 RowVersions,或者我是否需要以某种方式在进入(内部)LRP 时手动检查实体 RowVersions?
    2. 是否需要将整个 LRP 包装在外部数据上下文中(使用())以便 EF6 正确处理?

请注意,此应用的整体设计已经就绪,我需要在解决并发问题的同时尽量减少更改。

希望我已经足够清楚,很乐意回答任何有帮助的问题:-)

感谢您的指导。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...