我该如何在.NET的MVC中创建安全的每个网页请求事务?

8
我需要每个web请求在我的整个应用程序中实现事务。
我需要在控制器中启动事务,并且如果没有异常,则提交该事务。否则,回滚。
到目前为止,我有以下实现:
首先,我将事务创建为控制器的依赖项。然后,我会执行控制器/服务/存储库/其他工作。最后,主抽象控制器类执行其OnActionExecuted方法,在其中要么提交它,要么不提交。
我使用的技术列表如下:
MVC 4
Ninject
自动映射
服务模式
那么,我想知道关于死锁的情况怎么样?当两个Web请求同时处理并在两个存储库(与其DataContext实例相关联)上获得工作权限时,会发生什么情况?这意味着数据库中的两个表?
例如:一个请求首先想读取表Table1,然后是Table2,同时另一个请求想要使用Table2,然后是Table1。
我该怎么办?

我会作为评论回答,因为我的回答范围(我认为你的问题也是如此)需要比SO回答更多。在我看来,您需要将演示关注点与“领域”(或业务逻辑)分开。该架构为您提供了两个优势:a)能够编排单个逻辑子组件的执行及其参与(或不参与)MS控制的事务,并且b)代码基础设施更适合实现某种形式的自定义事务或排队,如果由于您的应用程序的特定情况而足够使用OOTB工具和最佳实践。 - G. Stoynev
2个回答

2

是的,我可以翻译,但我将这个选项转移到半自动流程的主要原因是我不想每次手动打开和关闭事务。 - AgentFire
有趣的问题,希望能看到使用提供的技术得到好的答案。 - Patrick Magee
1
我很喜欢你思考这个问题。我也遇到过类似的问题,花了几天时间来解决它。问题是因为我们需要一个工作单元来处理这种情况,但在EF中,我们已经有了DataContext,所以我们必须实现DataContext并实现IDisposable接口。然后,在上下文范围内使用using关键字将其包装起来。在调用完成后,我们可以释放与之关联的连接。 - thangchung

0

好的,我已经想到了一些解决方案:

  • 第一个方案是建立一个表列表,并通过该列表访问所有表。因此,如果上下文需要两个表,例如Table1Table2,那么Table2将不会在Table1之前被访问,从而避免死锁。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接