NServiceBus:saga 并发与 SQL 持久性如何工作?

NServiceBus: How does saga concurrency with SQL persister work?

我正在使用具有 SQL 持久性和 MSSQL 服务器的 NServiceBus。

我想确保在高并发场景下我的数据库中不会得到无效数据。

docs 我知道 SQL 持久化从版本 4.1.1 开始使用悲观并发。 但我不确定它是如何工作的,因为在“Starting Saga" and "Changes to Saga state”下只提到了乐观并发。

是否每个 saga 实例一次只处理一条消息,所有剩余的消息都在队列中等待 saga 处理?

是否可以将并发配置为使用乐观并发而不是 SQL 持久性的悲观并发?

乐观并发控制和悲观锁定都会导致 saga 实例只能处理 1 条消息。

可能会处理多条消息:

  • 乐观并发控制:2nd+ writer会失败,重试消息。

  • 锁定:锁定确保同一传奇实例上的多条消息将被延迟。有时这会由于锁升级而导致死锁,然后将重试消息。

悲观vs乐观,你无法选择。最新版本使用悲观锁定。见 https://docs.particular.net/persistence/sql/saga-concurrency:

Starting in version 4.1.1 conflicts cannot occur because the persistence uses pessimistic locking. Pessimistic locking is achieved by performing a SELECT ... FOR UPDATE or its dialect-specific equivalent.

Up to and including version 4.1, SQL persistence uses optimistic concurrency control when updating or deleting saga data.