transactionScope内的多个发布失败

时间:2012-11-16 16:40:09

标签: oracle nservicebus transactionscope distributed-transactions

我在不同子系统之间建模了一个集成架构。来自子系统的所有通知都使用原语Publish发送到订阅的子系统。这些通知是在for方法内的Handler循环中发送的,因此它们都在同一个TransactionScope中。我做了一个简单的例子来解释这一点:客户端向服务器发送消息,该服务器使用原语Publish发送可变数量的消息。这是服务器处理程序:

public void Handle(MyMessage message)
    {

        for (int i = 0; i < message.numberOfNotifications; i++)
        {
            Bus.Publish<NotificationMessage>(m =>
            {
                m.myPersonalCount= i;
            }
            );
        }
    }

我正在寻找的东西,我无法弄清楚当我将i设置为30或更低时,一切正常。从31或更多我收到此错误消息:

could not execute query
[ SELECT this_.SubscriberEndpoint as y0_ FROM "Subscription" this_ WHERE this_.MessageType in (?) ]

查看内部异常,我得到Unable to enlist in a distributed transaction

我使用原语Send尝试了同样的方法,但所有内容都是(尝试使用10k消息),所以这是一个仅与Publish指令相关的问题。

我将Oracle 10g用于dbms,将Oracle 11g用于客户端。

如果端点不是事务性的,我没有任何问题,所以问题似乎只与TransactionScope有关。

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

在任何想象中,我都不是Oracle专家。我甚至可能不会成为新手。

但是,我知道NServiceBus会查询每个发布的订阅存储,以防发布之间的订阅发生更改。

Oracle客户端是否可能对分布式事务中可以登记的查询数量有某种限制?也许作为一种预防N + 1类型性能问题的方法?

那就是说,你想发布30多个相同类型的事件似乎很奇怪。我想知道你的商业用例是什么。事件通常被认为是宣布发生了不可撤销的事情。为什么会发生30件事?

如果业务案例是可靠的,那么实现您自己的订阅存储引擎可能是一个好主意,该引擎使用一些有限的缓存(甚至5秒),这样您就不会在每次发布时都返回查询数据库。 / p>