远程交易

3
我如何在网络调用中“连接”两个事务组件?
[注意:可以安全地假设双方都使用C#]
详情: 假设我们有两个服务器A和B。 A上的进程(称为X)通过TCP与B上的服务Y通信。 这种通信不使用WCF,而是简单地通过TCP传递字节。 X还处理SQL Server M,Y处理SQL Server N。
我的意图是: 1. 客户端在TransactionScope中启动调用。 2. 处理SQL Server M并通过TCP呼叫到Y。 3. Y使用SQL Server Y执行某些操作。
我希望所有这些都尊重进行初始客户端调用的TransactionScope。换句话说,任一方的失败都应回滚双方。
如何让Y参与在X中启动的交易? 我知道需要启用MS DTC。
1个回答

0

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

Microsoft SQL Server 页面上关于 "Transact-SQL Distributed Transactions" 的内容涵盖了如何实现此功能。其中一个要求是两个 SQL Server 服务器需要在它们之间定义一个“链接服务器”关联。由于安全性方面的考虑,这可能需要由系统或数据库管理员进行定义。(在 SQL Server Management Studio 中查找“服务器对象”,以查看当前连接到的 SQL Server 服务器定义的“链接服务器”关联。)

然而,似乎更倾向于管理自定义分布式事务,其中在两个不同的服务器上执行数据库更新。这是更多的工作。实际上,这就像模拟类似于DTC的分布式事务,而不使用DTC。您的两个服务器之间需要进行关键通信,并且您还需要处理超时条件,以防一个服务器不响应操作请求。
这个处理序列的一个例子是...
1)客户端在TransactionScope中启动X调用。
2)为此调用在Server M上启动了一个事务。
3)Server M的事务更新已完成,但未提交。
4)Server M与Server Y通信,以便为X TransactionScope执行其更新。
5)Server Y启动自己的事务,执行其更新,提交更新并将成功/错误状态返回给Server M。
6)如果Server Y的更新成功,则Server M提交其更新;否则,Server M会回滚其待处理的更新。
如果在预定时间内未返回预期的成功/错误状态,则Server M还需要处理Server Y请求的超时。
另一个困难的情况是如何在Server M事务的最终提交生成错误时撤销Server Y的更新。对于这种情况,您需要向Server Y发送一个“撤销”请求,以某种方式撤消已经提交的更新。(手动在Server Y上进行更正可能是这种错误情况下可接受的选项。)

谢谢您的回复。然而,我不是要在两个SQL Server实例之间执行分布式事务。我想支持使用自己的代码进行分布式事务。例如,假设我的库提供了一个调用外部Web服务(非DTC)的函数。而外部服务有另一个函数来撤销更改。我希望我的库的客户端能够在事务块中使用我的库,以便在回滚的情况下,我可以进行补偿调用。也就是说,我想将自己的代码注册到DTC中,而不是使用支持DTC的两个资源。 - ashic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接