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.
我正在使用具有 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.