【问题标题】:Transaction coordinator for wcf distributed transactionswcf 分布式事务的事务协调器
【发布时间】:2013-10-05 09:07:14
【问题描述】:

我知道事务协调器用于协调不同类型资源之间的事务,例如 1)SQL Server 2)Oracle 3)MSMQ 4)文件系统等,他们有责任跟踪事务以及是否存在事务这些资源中的任何一个都失败了,它应该回滚 WCF 中所有其他资源的事务。

我想知道 a) 选择哪个事务协调器以及为什么 b)我们可以自己选择事务协调器还是由wcf自己自动完成 对于以下条件:-

1)如果 wcf 使用相同的 Microsoft 技术(Microsoft SQL Server & Microsoft Message Queue)的事务

2)如果 wcf 针对不同的数据库技术(Microsoft SQL Server、Oracle 和 MySQL)使用事务

3)如果 wcf 使用不同技术(Microsoft SQL Server、Oracle、文件系统等)对所有不同类型的资源使用事务

【问题讨论】:

  • 分布式事务会导致无数问题(性能和可扩展性差、死锁),这也是它们在近十年前失宠的原因。最好使用更适合分布式处理的架构,例如服务总线架构和 sagas

标签: c# wcf transactions distributed-transactions


【解决方案1】:

我强烈建议不要在这种异构环境中使用 DTC。涉及多种风险。其中只有一个限制了您未来的选择:如果您必须使用无法为其注册事务的文件系统(例如,网络文件共享)怎么办?还是云前端?还是一些第 3 方服务?

DTC 也非常糟糕地将系统的各个部分耦合在一起。涉及到各种耦合:空间、时间甚至平台(因为每个人必须知道如何加入特定的 DTC)。

尽管在性能方面(使用 DTC 比不使用 DTC 时差 数千 倍),但 DTC 效果很好,直到它没有。如果您使用 DTC,您应该准备好应对“交易有疑问”的情况和各种故障排除。它应该是您设计的一部分。

在某些情况下对于系统中的一些罕见的特定情况需要 DTC,但是如果您发现自己处于将交易和 DTC 视为神圣金锤的情况(我们刚刚开始事务,如果出现问题,我们“只是”回滚所有内容)我建议您立即停止。如果您停在这里,您将节省大量时间、错误、精力、金钱和资源。

我相信,进行不需要 DTC 的适当设计会更合乎逻辑,也更好。记住:业务不会回滚。我们有,程序员。当资金从一个账户转移到另一个账户时(可能在不同的银行),不涉及 DTC,这会很疯狂。他们不回滚,他们补偿。 有一些模式和方法可以正确地做到这一点,我们不能只是将整个世界包装在一个事务中。

因此,针对可以自主运行并自然地相互交流的独立上下文设计您的系统,您会发现自己处于一个更美好的世界:)

【讨论】:

  • 不回答 Op 的问题,但对反对 DTC 的论点 +1。
  • 争论反对使用分布式事务,而不是 DTC。任何事务协调员都会遇到同样的问题。如果一个人认为分布式事务是一个很好的选择(非常值得怀疑),DTC 是一个不错的选择。
  • @Alexey Raga “当资金从一个账户转移到另一个账户时(可能在不同的银行),不涉及 DTC(..)有正确的模式和方法”你能请说出这些模式的名称?
  • @Prokurors Saga,ProcessManager,至少一次交付,精确一次处理(通过重复数据删除或幂等性)
【解决方案2】:

我想说,如果您在 Windows 服务器上运行您的应用程序,Ms DTC 将是最自然的选择,因为它已经作为本机 Windows 服务的操作系统的一部分。 http://blogs.msdn.com/b/florinlazar/archive/2004/03/04/what-is-msdtc-and-why-do-i-need-to-care-about-it.aspx

我以前在自定义软件项目中将它用于 WCF 服务,它可以完成这项工作。如果是我,我会在新项目中再次使用它,除非有非常具体的理由不这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2010-10-26
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多