当服务构造有状态服务时,我遇到了死锁



GRPC END Contract=IPubSubPartitionManager Action=GetOrAddContextSelectorPartition ID=71eff709-392-439-a5c9-2b0bef6f5ba7 From=ipv4:10.0.0.56:35091 IsFault=True Duration(ms(=4932 Request{quot;contextSelector":"credentialValue":"uswestcentral-prod.sdnpubsub.core.windows.net客户端","credential-Regex":{"模式":"空字符串"},";enablePropertyBasedAcls":false}}响应{"errorMsg":"等待密钥上的共享锁超时;id=49b61cd7-31ba-4c5d-b579-d068326e8a90@133028293161628388@urn:上下文选择器映射/dataStore@132077756302731635,timeout=4000ms,txn=133029757743026569,lockResourceNameHash=6572262935404555983;具有锁的最旧txn=133029757735370545(共享模式(\r\n"}

此问题主要影响支持可重复读取的读取操作,用户可能会请求更新锁而不是共享锁更新锁是一种非对称锁,用于防止发生死锁,但当多个事务可能在此时更新时

  • 尽量避免TimeSpan.MaxValue超时。它可能检测到死锁
  • 不要在另一个事务的using语句中创建事务。例如:两个事务(T1和T2(分别试图读取和更新K1。由于它们最终都使用了共享锁,因此它们可能会死锁。在这种情况下,一个或两个操作将超时

为了避免频繁出现死锁,

  • 应增加默认事务超时。通常,尝试使用不同的值需要4秒
  • 确保事务是短暂的;如果它们持续的时间超过了必要的时间,您将阻塞队列中的其他任务超过必要的时间

参考:Azure Service Fabric

相关内容

最新更新