问题描述
我将 NServiceBus 与 sql 持久性和 MSsql Server 结合使用。
从 docs 我知道 sql 持久化程序从 4.1.1 版开始使用悲观并发。 但我不确定它是如何工作的,因为在“Starting Saga”和“Changes to Saga state”下只提到了乐观并发。
是否每个 saga 实例一次只处理一条消息,所有剩余的消息都在队列中等待由 saga 处理?
是否也可以将并发配置为使用乐观并发而不是 sql 持久化器的悲观并发?
解决方法
乐观并发控制和悲观锁定都导致 saga 实例只能处理 1 条消息。
然后可能会处理多个消息:
-
乐观并发控制:第 2 个以上的写入器将失败并重试消息。
-
锁定:锁定确保同一 saga 实例上的多条消息将被延迟。有时这会由于锁升级而导致死锁,然后消息将被重试。
关于悲观与乐观,你无法选择。最新版本使用悲观锁。见https://docs.particular.net/persistence/sql/saga-concurrency:
从4.1.1版本开始不会发生冲突,因为持久化使用了悲观锁。悲观锁定是通过执行 SELECT ... FOR UPDATE 或其方言特定的等效项来实现的。
直到并包括 4.1 版本,SQL 持久性在更新或删除 saga 数据时使用乐观并发控制。