我怎样才能避免加入NServiceBus'环境TransactionScope?

时间:2016-06-24 14:01:48

标签: c# oracle transactions nservicebus

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

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

异常详情:

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

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

请注意,我们在代码中使用BeginTransaction;我们发现它与TransactionScope并不相称,但我们以前从未在代码中使用TransactionScope,也不想在中使用TransactionScope 无论如何,在我们进入BeginTransaction调用之前,我们正在进行的例外情况正在发生。

1 个答案:

答案 0 :(得分:2)

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

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