【问题标题】:Multi-Database Transactional System & ASP.NET MVC多数据库事务系统 & ASP.NET MVC
【发布时间】:2009-12-01 10:53:31
【问题描述】:

因此,我面临一个挑战,即构建一个在线用户可以用来与组织互动的网站。:Asp.NET MVC Customer Application

其中一项要求是财务处理和会计。

我很乐意使用 SQL 事务和存储过程来执行此操作;即 CreateCustomer 还创建一个实体和一个帐户记录。我们有一个存储过程来执行此操作,它执行开始事务,创建一些我们需要的设置记录,然后执行提交。我没有看到使用 ORM 的好方法,在阅读了一些很棒的 blog articles 之后,我开始怀疑我是否走错了路。

这里的部分复杂性在于数据本身:

  1. 我正在查询 x 个数据库(每个现有客户一个)以获取我的一些数据,尽管我的应用程序也有自己的数据存储。我需要查询 x 个数据库,在 x 个数据库上运行存储过程,以及我自己的数据存储。

  2. 我没有看到对存储过程和事务等事物的强大支持,尽管它似乎确实存在。

也许我只是想让我的应用程序在这里成为一个钉子,因为 MVC 锤子太闪亮了。当然,我对原始 ADO.NET 非常满意,但我爱上了用 C# 编写 Linq 代码的富有表现力的感觉,我不想放弃它。

直奔问题:

这是个坏主意吗?我应该尝试使用 Linq / Entity Framework 还是 nHibernate 之类的东西......并坚持使用 ORM 模式,还是应该丢弃它并使用原始 ADO.NET 数据访问?

编辑:音阶注释;从每秒查询的角度来看,这个应用程序不是“巨大的”。但是,从数据复杂性的角度来看,它确实需要查询 50 多个数据库(全部相同或接近)才能从外部应用程序读取数据并将数据发布回该应用程序。 ORM 在处理“我的”数据存储时感觉不错,但在从外部应用程序访问数据时感觉很不对。

【问题讨论】:

    标签: asp.net asp.net-mvc orm linq-to-entities


    【解决方案1】:

    从一定规模(数据库数量)开始,你必须改变范式。你有这个尺寸吗?

    当您部署最终是分布式应用程序但又试图将其作为普通本地应用程序进行控制时,您将遇到一系列关于可用性、可扩展性和正确性的基本问题。如果您使用“分布式事务”、“链接服务器”和“ORM”等概念,那么您就走错了路。真正的分布式应用程序将使用“消息”、“队列”和“服务”等术语。像 Linq、EF、nHibernate 这样的术语都很好,但是 none 会给你带来比简单的 Transact-SQL SELECT 语句带来的任何额外的东西。换句话说,如果 SELECT 解决了您的问题,那么客户端的各种 ORM 将起作用。如果没有,他们将不会添加任何奇迹值。

    我建议您查看 SQLCAT: High Performance Distributed Applications in Real World Deployments 上的幻灯片,其中解释了像 MySpace 这样的网站如何设法读取和写入包含近 500 台服务器和数千个数据库的存储。

    您最终需要内化的是:一个数据库可以有 95% 的可用性(正常运行时间可接受的服务响应时间)。由 10 个数据库组成且可用性为 95% 的系统具有 59% 的可用性。一个由 100 个数据库组成的系统,每个数据库的可用性为 99.5%,可用性为 60%。具有 99.95% 可用性(每周 5 分钟停机时间)的 1000 个数据库具有 60% 的可用性。这是一个理想的情况。实际上,资源消耗(例如,线程在尝试访问不可用或缓慢的资源时被阻塞)总是会导致滚雪球效应,这会使事情变得更糟。

    这意味着无法编写依赖于同步、紧密耦合的操作和事务的大型分布式系统。根本不可能。您总是依赖异步操作(通常是消息传递和队列),这与您的普通数据库应用程序完全不同。

    【讨论】:

    • 很好的答案,谢谢 Remus。我以前广泛使用过 ActiveMQ,实际上我对队列很熟悉。从 qps 的角度来看,这个应用程序的规模并不算太大;但我们移动的信息确实必须得到保证。
    • 或许这篇文章可以增加一些价值:rusanu.com/2009/08/05/asynchronous-procedure-execution。如果您熟悉 ActiveMQ,那么您将理解我在链接中关于在 HA 故障转移、备份/恢复等情况下 ACID 提交需要 可靠 交付的观点。
    • 顺便说一句,我确实看到了使用基于异步队列的工作流的价值,即使任何事情发生在一个数据库中,也没有任何远程交付。但是在这个范例中,除了一流的表示层之外,ASP.Net MVC 及其闪亮的 LINQ 几乎没有“生计”……
    • 这也意味着我必须从创建自己的异步数据层开始,这是我希望以后做的任务。 :D
    • 我有更多的回应,这是一个有趣的话题,我很想听听关于......
    【解决方案2】:

    使用 System.Transaction 中可用的 TransactionScope 对象。

    【讨论】:

    • OK ...您的意思是“坚持使用 MVC,但使用 TransactionScope 在没有 ORM 的原始 ADO.NET 中调用具有 BEGIN TRANSACTION / ROLLBACK / COMMIT 语句的存储过程?”
    • TransactionScope 使用 Microsoft 分布式事务协调器,它为您提供数据库操作之外的事务支持。它还支持包含在事务中的磁盘 I/O。它是多数据库事务的主要候选者。
    【解决方案3】:

    我选择的是使用实体框架来允许访问应用程序的主数据存储,并创建一个自定义 DAL 来访问外部应用程序数据和访问应用程序内的存储过程。

    希望 Entity Framework 4.0 能解决这个问题。目前,我正在使用此处列出的概念。

    http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/44a0a7c2-7c1b-43bc-98e0-4d072b94b2ab/

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 2019-06-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多