C# 远程事务

C# 远程事务,c#,sql-server,tcp,transactions,msdtc,C#,Sql Server,Tcp,Transactions,Msdtc,如何通过网络调用“连接”两个事务组件 [注意:假设双方都使用C#是安全的。] 详情: 比如说,我们有两台服务器,A和B。A上的进程(比如X)通过TCP与B上的服务Y通信。此通信不使用WCF,而是通过TCP传递的简单字节。X还处理SQL Server,M.Y处理SQL Server。 我想做的是: 客户端在TransactionScope内的X中启动调用 它处理SQLServerM并通过TCP向外调用Y Y使用SQL Server Y执行某些操作 我希望所有这些都是为了尊重首次客户呼叫的交易范围。

如何通过网络调用“连接”两个事务组件

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

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

  • 客户端在TransactionScope内的X中启动调用
  • 它处理SQLServerM并通过TCP向外调用Y
  • Y使用SQL Server Y执行某些操作
  • 我希望所有这些都是为了尊重首次客户呼叫的交易范围。换句话说,任何一方的失败都应该使双方都回滚


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

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

    “”上的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请求上的超时


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

    感谢您的回复。但是,我不希望跨两个SQL Server实例执行分布式事务。我希望用自己的代码支持分布式事务。例如,假设my library提供了一个调用web服务的函数(非DTC,外部)。外部服务还有另一个功能来逆转这些变化。我希望我的库的客户端能够在事务块内使用我的库,以便在回滚的情况下,我可以进行补偿调用。i、 e.我想在DTC中登记我自己的代码,而不是使用两个支持DTC的资源,