【发布时间】:2020-05-11 06:37:51
【问题描述】:
我有一个运行时间相当长的事务,它更新多个可靠集合上的大值(字典)。我一直遇到 InvalidOperationExceptions(事务正在提交或回滚),重试操作只会再次导致异常。有什么办法可以缓解这个问题吗?
我认为这与文档中所说的事务日志的事务阻塞截断有关。放大或缩小日志会有帮助吗?
请处理 InvalidOperationException。由于各种原因,系统可能会中止用户交易。例如,当 Reliable State Manager 将其角色更改为 Primary 或长时间运行的事务阻止截断事务日志时。在这种情况下,用户可能会收到 InvalidOperationException 指示他们的事务已经终止。假设用户没有请求终止事务,处理此异常的最佳方法是处理该事务,检查是否已发出取消令牌(或副本的角色已更改),如果没有则创建新事务并重试。
【问题讨论】:
-
没有上下文这很难回答。考虑列出密钥,然后在单独的事务中处理每个密钥?也许?
-
是的,如果我将操作拆分为多个事务,它会起作用,但是如果出现错误,我会失去一致性,所以我真的需要一个事务来工作。我怎样才能获得更多信息来了解导致事务回滚的原因?有这么多可配置的设置,我觉得在某个地方增加一些限制会有所帮助,我只是不知道是哪一个。
-
增加限制很可能只会延迟相同的问题,如果任何配置有帮助的话。如果应用程序设计依赖于有争议的数据结构,锁将始终显示为性能问题。如果可能,考虑如何减少数据的争议。作为一般规则(此处可能适用也可能不适用) - 采用尽可能小的锁以确保一致性。
-
查看我发布的答案。我相当确定问题是由于数据的大小,事务日志在事务期间被截断。提高 minLogSizeInMb 完全解决了这个问题。我不认为锁是问题所在,因为只有一个线程访问数据时它会一直失败。我的应用程序已设置,因此在给定时间只有一个线程会处理密钥,基本上是序列化事务。
-
@StenPetrov 你说得对,增加 MinLogSizeInMB 只会推迟问题。最终会有一个交易在交易中截断的操作,我再次收到错误。我知道文档说要针对这种确切情况处理 InvalidOperationException 并重试,但这感觉很脏,因为不仅事务日志截断会捕获各种异常。例如,如果我在没有项目的集合上调用 Single(),它也会抛出 InvalidOperationException,并且无需重试。
标签: azure-service-fabric service-fabric-stateful