Connection behavior
When combining PostgreSQL and SQL persistence using the PostgreSQL dialect, the connection behaves differently based on whether the Outbox is enabled or disabled. This influences where the saga data is stored.
Without Outbox
PostgreSQL Transport TransactionMode | Connection sharing | Saga location |
---|---|---|
SendsAtomicWithReceive | PostgreSQL Transport uses isolated transaction for send and receive | Transport DB |
ReceiveOnly | PostgreSQL Transport uses isolated transaction for receive | Transport DB |
None | No transactions | Persistence DB |
Explicitly opting out of connection sharing when not using the Outbox
When an endpoint uses PostgreSQL Persistence combined with the PostgreSQL Transport with Outbox disabled, the persistence uses the connection and transaction context established by the transport when accessing saga data. This behavior ensures exactly-once message processing behavior as the state change of the saga is committed atomically while consuming the message that triggered it.
When using the outbox, SQL Persistence always opens its own connection. In order to force using a separate connection even when the outbox is disabled, use the following API:
In this mode NServiceBus does not guarantee exactly-once message processing behavior which means that saga message handling logic might be called multiple times for a single incoming message in case the previous processing attempts failed just before consuming the message.
With Outbox
PostgreSQL Transport TransactionMode | Connection sharing | Saga location |
---|---|---|
SendsAtomicWithReceive | Not supported | N/A |
ReceiveOnly | Connection sharing via PostgreSQL Transport storage context | Persistence DB |
None | Not supported | N/A |