如何在.net的MVC中创建安全的每Web请求事务?

时间:2013-03-06 15:00:05

标签: asp.net-mvc asp.net-mvc-4 transactions httpwebrequest transactionscope

我需要在其处理的每个Web请求中成为我的整个应用程序事务处理。

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

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

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

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

  • MVC 4
  • Ninject
  • Automapper
  • 服务模式

现在,我想知道的是死锁怎么办?当两个Web请求将同时处理时会发生什么,此外他们将获得使用两个存储库(与他们的DataContext个实例相关联)的权利,这意味着,数据库中的两个表

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

我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

How to prevent EntityFramework deadlock when concurrently running these two statements

希望这个帮助

答案 1 :(得分:0)

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

  • 第一个是拥有所有表的列表并按该列表访问它们。因此,如果上下文要求两者都不会在Table2之前访问示例Table1,并且不会发生死锁。

  • 第二个是创建一个懒惰的IO系统,它跟踪所有必要的更改(比如添加项目,重新获取其ID并在其他地方使用它)。但似乎很难建立起来。

  • 另一种方法是在每个数据库请求开始时创建应用程序级锁,并在最后释放它。该解决方案完全无死锁,但只能在低负载系统上使用。