【问题标题】:Remote Transactions远程交易
【发布时间】:2014-05-09 04:37:11
【问题描述】:

如何通过网络调用“加入”两个事务性组件?

[注意:假设双方都使用 C# 是安全的。]

详情: 假设我们有两台服务器,A 和 B。A 上的进程(假设 X)通过 TCP 与 B 上的服务 Y 通信。此通信不使用 WCF,而是通过 TCP 传递的简单字节。 X 还处理 SQL Server,M. Y 处理 SQL Server N。 我想做什么:

  1. 客户端在 TransactionScope 内的 X 中启动调用。
  2. 它处理 SQL Server M 并通过 TCP 向 Y 发出调用。
  3. Y 对 SQL Server Y 做了一些事情。

我希望所有这一切都符合进行初始客户端调用的 TransactionScope。换句话说,任何一方的失败都应该回滚双方。

如何让 Y 参与 X 开始的交易?我知道需要启用 MS DTC。

【问题讨论】:

    标签: c# sql-server tcp transactions msdtc


    【解决方案1】:

    我相信您正在尝试创建一个“分布式事务”,其中两个或多个表在单个事务中更新,而这些表恰好是在不同 SQL Server 服务器上运行的不同数据库中定义的。 “两阶段提交”过程用于在两台服务器之间进行协调,以便更新在每台服务器上成功或在任何一台服务器遇到问题时在每台服务器上回滚。

    Transact-SQL Distributed Transactions”上的此 Microsoft SQL Server 页面介绍了如何执行此操作。一项要求是两个 SQL Server 服务器需要在它们之间定义一个“链接服务器”关联。由于安全后果,这可能需要由系统或数据库管理员定义。 (在“服务器对象”下的 SQL Server Management Studio 中查找您当前连接到的 SQL Server 服务器定义的“链接服务器”关联。)

    但是,似乎更倾向于管理自定义分布式事务,其中数据库更新在两个不同的服务器上执行。这是更多的工作。实际上,这就像在不使用 DTC 的情况下模拟类似 DTC 的分布式事务。两台服务器之间所需的通信非常重要,您还需要处理超时条件,以防一台服务器不响应操作请求。

    这个处理顺序的一个例子是......

    1) 客户端在 TransactionScope 内的 X 中启动调用。

    2) 在服务器 M 上为此调用启动一个事务。

    3) 服务器 M 的事务更新已完成,但未提交。

    4) 服务器 M 与服务器 Y 通信以更新 X TransactionScope。

    5) 服务器 Y 启动自己的事务,进行更新,提交更新并将成功/错误状态返回给服务器 M

    6) 如果服务器 Y 更新成功,服务器 M 然后提交其更新;如果不是,那么服务器 M 会回滚其挂起的更新。

    如果在预定时间内未返回预期的成功/错误状态,服务器 M 还需要处理服务器 Y 请求的超时。

    另一个困难的情况是如果服务器 M 事务的最终提交产生错误,如何撤消服务器 Y 更新。对于这种情况,您需要向服务器 Y 发送“撤消”请求,以某种方式撤消已提交的更新。 (对于这种错误情况,在服务器 Y 上手动更正可能是一个可接受的选项。)

    【讨论】:

    • 感谢您的回复。但是,我不希望跨两个 SQL Server 实例执行分布式事务。我希望用我自己的代码支持分布式事务。例如,假设我的库提供了调用 Web 服务(非 DTC,外部)的函数。并且外部服务有另一个功能来扭转变化。我希望我的库的客户能够在事务块内使用我的库,这样在回滚的情况下,我可以进行补偿调用。即我想将我自己的代码加入 DTC,而不是使用支持 DTC 的两个资源,
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多