代码之家  ›  专栏  ›  技术社区  ›  GSerg

在两个连接之间共享事务空间

  •  1
  • GSerg  · 技术社区  · 16 年前

    有一个应用程序可以在SQLServer2008上启动事务并移动一些数据。然后,当事务仍未提交时,应用程序打印出一些标签。在打印成功之前不提交事务是非常重要的;如果发生打印错误,所有内容都将回滚。

    现在,打印引擎a)变得相当庞大和复杂,b)最终需要从许多地方获得。因此,决定将发动机分离并进行维修。

    是的,可以将打印所需的所有数据从客户端应用程序传递到该服务器,以便服务器只打印,而不关心数据库。然而,这意味着在每个需要打印的应用程序中留下成堆的代码和标签模板;实际上,这样就不会发生什么分离。相反,只需将所需内容的ID传递给服务,然后服务就会进入数据库并获取数据,这将非常有效(并且对我来说更容易编写和维护)。所有格式和布局都将集中化,应用程序将只要求打印作业12345中的5份送货单。

    现在,这不会发生,因为在打印时事务仍然没有提交。该服务将无法读取数据,并且使用readuncommitted也不是一个很好的选择。

    sp_bindsession 加入两个会话,应用程序和服务的,但它突然被弃用,并从未来的版本中删除。帮助建议我改用MARS或分布式事务,但我看不出它们会有什么帮助。

    有什么建议吗?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Justin    16 年前

    我的直觉是,试图以这种方式在两个进程之间共享事务不是一个好主意。

    我的方法是要么将所有数据传递给服务,要么研究在打印期间保持事务打开的替代方案——简单的机制(例如每个记录的IsPrinted标志)是否不够?

    如果做不到这一点,我能看到的最有效的方法是让打印服务将其所有SQL请求传递回原始进程,以便它们可以在原始事务的上下文中执行。

        2
  •  0
  •   Remus Rusanu    16 年前

    只有sp_getbindtoken/sp_bindsession可以按您的要求执行操作,它已被弃用并将被删除。

    目前,我认为您最好的选择是使用会话绑定令牌。尽管我不得不指出,在实际操作(打印)期间保持交易开放是一种非常糟糕的做法。