【问题标题】:Serialize a .Net SqlTransaction?序列化 .Net SqlTransaction?
【发布时间】:2010-11-15 21:10:05
【问题描述】:

我们有一个有趣的设置,我们将 SqlTransactions 持久化到 Web 应用程序的应用程序内存中。我们正在考虑将我们的 Web 应用程序移动到 NLB 场景中,因此我们需要一种方法使这些事务不与单个机器的内存绑定。有什么办法可以做到这一点..我尝试序列化 SqlTransaction 和 SqlCommand,似乎都不起作用。我需要开始研究 System.Transactions 命名空间吗?

【问题讨论】:

  • 我很好奇你为什么认为你可能需要这样做。
  • 不能直接放到Application[]中而不序列化吗?
  • @quillbreaker:NLB 是网络负载平衡,因此每个 HTTP POST 可能会发送到场中的不同 Web 服务器。 Application 数组是每台机器特有的,因此序列化数据的想法是可以在机器之间移动。
  • 为了更清楚,这就是我想做的事情:启动一个事务,在该事务中执行一些 sql。稍后(比如一两秒,但我所有现有的对象/连接都超出了范围),使用同一个事务对象(希望在某处序列化),执行并提交另一批 sql。可能的?不可能?
  • @steven:对。知道了。这将与我在尝试创建可序列化的 SqlDataAdapter 时遇到的相同 - SqlTransaction 是一个密封类。

标签: .net asp.net serialization ado.net


【解决方案1】:

我认为这行不通。交易被设计为临时的和本地的。

编辑

也许“暂时”比“暂时”更好。

【讨论】:

    【解决方案2】:

    SqlTransaction 存储在Application 状态是没有意义的。事务不应跨越单个请求。


    我假设您知道Application 状态由所有用户共享。

    为什么你使用Application state 而不是Session state? Session 可以跨负载平衡器工作,可以使用 State Server 或 SQL Server 形式的会话持久性。

    【讨论】:

    • 为什么一个事务不能跨越多个请求?这就是交易的全部意义所在!
    • 不,不是。我的意思是 HTTP 请求,顺便说一句。事务的目的是确保多个数据库操作成功或失败。如果您有一个网站在一个请求中执行一个操作,然后返回并在另一个请求中执行另一个操作,那么您真的不了解 Web 是如何工作的。如果用户在第一次操作后关闭计算机会发生什么?
    • 我知道网络是如何工作的,TYVM。但是交易可以并且已经跨越了网络世界中的多个请求。恰当的例子:WCF 事务 (msdn.microsoft.com/en-us/library/ms730266.aspx)。我想你可能对他询问 SQL 事务的事实感到困惑。事实上,他已经拥有跨越多个 HTTP 请求的事务;他只是想将它们移动到多台机器上,因为他现在正在进行负载平衡。
    • WCF 事务是分布式事务,并且应该如此。我向你保证我知道这些。这似乎有所不同:将 Web 应用程序视为桌面应用程序,以 Application 状态保存事务,就像将事务保存在表单的成员变量或全局变量中一样。它没有考虑到 Web 以无状态的方式工作得更好,并且事情发生在一个请求和下一个请求之间,并且 Web 应用程序的控制级别低于桌面应用程序。希望我的原因是错误的。
    • 即使在桌面应用程序中,这也是一个坏主意,并且已经存在了几十年。您已经完成了等待用户输入的交易!如果他们去吃午饭怎么办!您正在保留交易和相应的锁,坐等人!
    【解决方案3】:

    您可能想看看Distributed Transaction Coordinator。我没有亲自使用它来处理跨多个请求的事务,但这就是它的目的。该链接是 COM 和 Win32 的开发人员指南。这是a tutorial,我认为可以帮助您开始使用.NET 方面的东西。

    【讨论】:

    • 在 .NET 中无需针对 DTC 进行编程。如有必要,SqlTransaction 将被提升为分布式事务。
    • @Randolpho:如果我理解正确,DTC 的重点是允许单个请求跨越层。换句话说,它是为了更深入,而不是更广泛。我弄错了吗?
    【解决方案4】:

    我之前没有做过这种事情,但是SqlTransaction有一个CreateObjRef方法,它返回一个ObjRef,它是可序列化的。而 ObjRef 似乎是你应该来回混搭的东西。

    ObjRef Class

    【讨论】:

      【解决方案5】:

      首先,序列化仅用于捕获值/值类型的快照 - sstudf,如字符串数字等。事务是针对特定用户在短时间内“活动”(超时)的东西,具有x 资源(通常连接到数据库)。由于这些东西在不断变化,如果可能的话,将它们重新序列化然后再恢复它们真的会把事情搞砸,因为很多事情都会改变,你会陷入混乱。

      如果交易本来是可序列化的,他们会实现接口,你所要求的只是简单的坏/愚蠢。

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 2010-11-04
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多