8

我需要在它处理的每个 Web 请求中使我的整个应用程序都具有事务性。

我需要启动事务,如果控制器中没有异常,则提交它。否则,回滚。

到目前为止,我有以下实现:

  • 首先,我在控制器上创建事务作为依赖项。
  • 然后,我做我的控制器/服务/存储库/其他工作。
  • 最后,主要的抽象控制器类执行它的OnActionExecuted方法,我要么提交它,要么不提交。

以下是我使用的技术列表:

  • MVC 4
  • 忍者
  • 自动映射器
  • 服务模式

现在,我想知道死锁是怎么回事?当同时处理两个 Web 请求时会发生什么,并且他们将获得使用两个存储库(链接到他们的DataContext实例)的权利,这意味着数据库中的两个表

例如:一个请求首先要读取 tableTable1然后Table2,同时另一个请求想要使用Table2然后使用Table1

我该怎么办?

4

2 回答 2

2

您可以处理事务的开始和停止以调用 DB 请检查此

并发运行这两条语句时如何防止EntityFramework死锁

希望这有帮助

于 2013-05-14T12:36:53.707 回答
0

好的,我已经意识到这个问题的一些解决方案:

  • 第一个是拥有所有表的列表并通过该列表访问它们。因此,如果上下文都需要这两个示例,Table2则永远不会访问示例Table1,并且不会发生死锁。

  • 第二个是创建一个惰性 IO 系统来跟踪所有必要的更改(比如添加一个项目,检索它的 id 并在其他地方使用它)。但它似乎很难构建。

  • 另一种方法是在每个数据库请求开始时为其创建应用程序级锁,并在结束时释放它。该解决方案完全没有死锁,但它仅适用于低负载系统。

于 2013-05-20T06:56:52.117 回答