NServiceBus传奇中使用了哪些事务?
我使用Azure表存储进行持久化,使用Azure服务总线进行传输,我想知道saga的处理程序中有哪些事务?它和普通的处理器一样吗NServiceBus传奇中使用了哪些事务?,nservicebus,nservicebus-sagas,Nservicebus,Nservicebus Sagas,我使用Azure表存储进行持久化,使用Azure服务总线进行传输,我想知道saga的处理程序中有哪些事务?它和普通的处理器一样吗 我这样问是因为我看到数据库更改(通常在环境事务中登记的SqlBulkCopy)多次发生。在这个场景中,我直接从Saga访问数据库,以“单线程”方式处理消息,但它似乎不起作用。Azure Service Bus transport仅支持以下级别 SendsAtomicWithReceive(默认) 仅接收 没有 它不支持事务作用域级别。这就是你要找的 这是为什么?Azu
我这样问是因为我看到数据库更改(通常在环境事务中登记的SqlBulkCopy)多次发生。在这个场景中,我直接从Saga访问数据库,以“单线程”方式处理消息,但它似乎不起作用。Azure Service Bus transport仅支持以下级别
这是为什么?Azure服务总线不允许任何环境事务发生。任何与业务相关的数据操作都将从处理程序事务中排除。为了避免重复的业务数据写入,您需要实现幂等性,以确保在重试消息时不会多次写入相同的业务数据。谢谢。我的印象是,正常的处理程序确实包含一个事务,因为当它们失败时,数据库更改将回滚。或者我遗漏了一个要点:)没错,处理程序参与为端点定义的事务级别。级别取决于底层传输的能力。如果您碰巧使用MSMQ或SQL Server传输,则业务数据操作可以与传输参与同一事务。ASB、ASQ、ASQ和RabbitMQ的情况并非如此。但是,如果我正在使用一个不支持事务的传输,那么处理程序是否仍然使用一个独立于传输事务的事务?如果答案是肯定的,那么在一个传奇中处理程序的行为是相同的吗?处理程序是端点设置的事务级别的主体,这取决于所使用的传输。例如,使用ASB传输,您可以在处理程序中拥有自己的事务,但它将是无关的,并且完全特定于用户。独立处理程序和Sagas处理程序都遵循这一点。顺便说一句,不建议在Saga处理程序中执行任何工作。相反,您应该向独立处理程序发送工作请求。非常感谢。真的帮我解决了一些问题!