gpt4 book ai didi

c# - 如何避免加入 NServiceBus 的环境 TransactionScope?

转载 作者:行者123 更新时间:2023-11-30 16:48:31 25 4
gpt4 key购买 nike

我们有一项服务可以与 SQL Server 或 Oracle 后端一起使用。我们刚刚开始添加消息传递功能,以允许我们的服务与仅 Oracle 的应用程序进行通信,并决定使用 NServiceBus。决定放置 NServiceBus 订阅/队列/等。在应用程序的数据库上,因此 NServiceBus 始终使用 Oracle。

当该服务与 SQL Server 后端一起使用时,一切都很好。但是,当我们尝试将服务与 Oracle 后端(一个与应用程序和 NServiceBus 使用的数据库完全独立的数据库,通常在不同的服务器上)一起使用时,我们会遇到异常。

异常详情:

  • 异常文本:“连接已经是本地或分布式事务的一部分”或有时“无法加入分布式事务”(最小 VM 测试环境却得到“无法加载 OraMTS”)
  • 异常发生在我们的数据库层调用connection.Open()
  • 连接的连接字符串是标准的Data Source=foo;User Id=bar;Password=baz
  • 该服务正在使用非托管 Oracle 提供程序
  • 服务在开始处理消息时使用装饰器进行连接,然后断开连接;删除装饰器并在服务启动时(在设置 NServiceBus 之前)连接服务可以解决问题,但这意味着如果该连接发生任何事情,则必须重新启动服务

异常文本让我们认为连接正在尝试加入 NServiceBus 的 TransactionScope。那是对的吗?如果是这样,是否有一些选项我们可以添加到连接字符串或在连接本身上配置以避免加入环境 TransactionScope?

请注意,我们在代码中使用了 BeginTransaction;我们知道它不能很好地与 TransactionScope 一起使用,但我们以前从未在我们的代码中使用过 TransactionScope,并且不想 TransactionScope 中,无论如何我们的异常在我们进行 BeginTransaction 调用之前就已经发生了。

最佳答案

Enlist=false 放入连接字符串中。

这个问题的解决方案有点难以找到,因为每个人似乎都假设您要么希望所有连接都使用分布式事务,要么都不希望使用分布式事务。但是我最终在 documentation 中找到了对于 Microsoft Oracle 提供程序,您可以将 Enlist=false 添加到您的连接字符串中以指示您不希望连接自动加入事件的分布式事务(显然仍然可以手动加入分布式事务后来,但我没有仔细调查,因为它与我们的案例无关)。

关于c# - 如何避免加入 NServiceBus 的环境 TransactionScope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com