我们的服务可以与 SQL Server 或 Oracle 后端配合使用。我们刚开始添加了消息传递功能,以便使我们的服务能够与仅支持Oracle的应用程序进行通信,决定采用 NServiceBus。决定将 NServiceBus 的订阅/队列等放置在应用程序的数据库上,这样 NServiceBus 就总是使用 Oracle。
当将服务用于 SQL Server 后端时,一切都很好。但是当我们尝试将服务与 Oracle 后端(通常位于不同服务器上,完全不同的数据库与应用程序及 NServiceBus 所使用的数据库)配合使用时,就会出现异常。
异常详细信息如下:
- 异常文本:“Connection is already part of a local or a distributed transaction”,有时会是“Unable to enlist in a distributed transaction”(最小VM测试环境中则为“无法加载OraMTS”) - 当我们的数据库层调用 `connection.Open()` 时,就会出现该异常。 - 连接的连接字符串为标准格式的 `Data Source=foo;User Id=bar;Password=baz` - 该服务使用非托管的 Oracle 提供程序 - 该服务使用一个装饰器,在处理消息时开始连接,然后在完成后断开连接;如果删除该装饰器并改为在启动时连接(在设置NServiceBus之前),可以解决问题,但这意味着如果该连接发生任何问题,则必须重新启动该服务。
异常文本使我们认为连接正在试图加入 NServiceBus 的 TransactionScope。如果是这样,那么有没有一些选项可以添加到连接字符串或在连接本身上进行配置,以避免加入环境事务范围?请注意,代码中使用了 `BeginTransaction`;我们知道它与 TransactionScope 不兼容,但我们之前从未在代码中使用过 TransactionScope,也不想位于 TransactionScope 中,在任何情况下,我们得到的异常是在我们甚至没有到达 `BeginTransaction` 调用之前就发生了。
当将服务用于 SQL Server 后端时,一切都很好。但是当我们尝试将服务与 Oracle 后端(通常位于不同服务器上,完全不同的数据库与应用程序及 NServiceBus 所使用的数据库)配合使用时,就会出现异常。
异常详细信息如下:
- 异常文本:“Connection is already part of a local or a distributed transaction”,有时会是“Unable to enlist in a distributed transaction”(最小VM测试环境中则为“无法加载OraMTS”) - 当我们的数据库层调用 `connection.Open()` 时,就会出现该异常。 - 连接的连接字符串为标准格式的 `Data Source=foo;User Id=bar;Password=baz` - 该服务使用非托管的 Oracle 提供程序 - 该服务使用一个装饰器,在处理消息时开始连接,然后在完成后断开连接;如果删除该装饰器并改为在启动时连接(在设置NServiceBus之前),可以解决问题,但这意味着如果该连接发生任何问题,则必须重新启动该服务。
异常文本使我们认为连接正在试图加入 NServiceBus 的 TransactionScope。如果是这样,那么有没有一些选项可以添加到连接字符串或在连接本身上进行配置,以避免加入环境事务范围?请注意,代码中使用了 `BeginTransaction`;我们知道它与 TransactionScope 不兼容,但我们之前从未在代码中使用过 TransactionScope,也不想位于 TransactionScope 中,在任何情况下,我们得到的异常是在我们甚至没有到达 `BeginTransaction` 调用之前就发生了。