【问题标题】:How can I create safe per-web-request transaction in .net's MVC?如何在 .net MVC 中创建安全的每个 Web 请求事务?
【发布时间】:2013-02-21 10:37:34
【问题描述】:

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

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

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

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

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

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

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

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

我该怎么办?

【问题讨论】:

  • 我将作为评论回答,因为我的回答范围(我认为您的问题)需要的不仅仅是 SO 回答。 IMO 您需要将您的演示问题与您的“域”(或业务逻辑)分开。该架构为您提供了两个优势:a) 能够协调各个逻辑子组件的执行以及它们参与(或不参与)MS 控制的事务,以及 b) 代码基础架构可以更好地实现某种形式的自定义事务或排队,如果开箱即用的工具和最佳实践由于您的应用的具体情况而不够用

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


【解决方案1】:

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

How to prevent EntityFramework deadlock when concurrently running these two statements

希望有帮助

【讨论】:

  • 是的,我可以,但我将此选项转移到半自动流程的主要原因是我不想每次打开和关闭交易时都手动。
  • 有趣的问题,希望通过所提供的技术看到一个很好的答案。
  • 我爱你思考这个问题。我得到了这样的东西,并花了几天时间解决它。问题是,我们需要一个工作单元来处理这种情况,但在 EF 中我们已经在 DataContext 中拥有它,所以我们必须通过实现 IDisposable 接口来实现 DataContext。然后在我们像使用关键字一样将它包装在上下文范围内之后。调用完成后,我们可以释放与之关联的连接。
【解决方案2】:

好的,我已经实现了一些解决问题的方法:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多