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

问题描述:

我需要在它处理的每个Web请求中都成为我的整个应用程序事务。如何在.net的MVC中创建安全的每Web请求事务?

我需要事务启动,并且如果控制器中没有例外,请提交它。否则,回滚。

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

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

在这里做了,我使用的技术列表:

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

现在,我想要什么要知道是什么关于死锁?当两个Web请求将同时处理,并且他们将获得与两个存储库(它们与DataContext实例相关联)的工作权限,并且这意味着,两个表在数据库中会发生什么?

例如:在第一个请求,想读表Table1然后Table2,在此期间其他请求希望与Table2工作,然后用Table1

我该怎么办?

+0

我会以评论的形式回答,因为我的答案的范围(以及我认为你的问题)需要的不仅仅是答案。国际海事组织,你需要将你的表达关注与你的“域”(或业务逻辑)分开。该体系结构为您提供了两个优势:a)协调各个逻辑子组件的执行以及它们在MS控制的事务中的参与(或不参与)的能力,以及b)编码基础设施,它可以更好地实现某种形式的自定义事务或排队,如果由于你的应用程序的具体情况开箱即用的工具和最佳做法是不够的 – 2013-05-19 20:01:30

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

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

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

  • 另一种方法是在每个数据库请求的起始处创建应用程序级锁,并在最后释放它。该解决方案完全无死锁,但仅适用于低负载系统。

,你可以处理的开始和调用数据库事务的停止,请检查该

How to prevent EntityFramework deadlock when concurrently running these two statements

希望这有助于

+0

是的我可以但我把这个选项转移到半自动流程的主要原因是我不想手动每次打开和关闭交易。 – AgentFire 2013-05-14 14:15:43

+0

有趣的问题,喜欢用你提供的技术来看这个问题。 – 2013-05-15 21:05:37

+1

我爱你考虑这个问题。我已经得到了一些这样的东西,并花了几天的时间来解决它。这个问题是因为我们需要一个工作单元来处理这种情况,但是在EF中我们已经在DataContext中使用了它,所以我们必须实现DataContext并实现IDisposable接口。然后,我们将其包装在上下文作用域中,例如using关键字。我们可以在完成调用后释放与它关联的连接。 – thangchung 2013-05-17 08:02:15