悲观并发情况下数据存储中出现争用错误

问题描述 投票:0回答:1

我在 Google Cloud 中以数据存储模式使用 Firestore 和 Node.js 客户端库。在数据存储中,我的实体上有一个计数器字段,有时需要在几秒钟内递增 15-20 次(否则不会经常写入)。我在事务中增加它,以便我可以在增加它之前读取它的值。我已经阅读了事务并发模式并检查了

Datastore 模式数据库中的 Firestore 默认使用悲观并发模式。

(我还使用

gcloud
CLI 设置它只是为了确保)

docs中,在悲观并发模式下,它说:

当两个或多个并发读写事务读取或写入相同数据时,一个事务持有的锁会延迟其他事务。

所以根据我的理解,这种模式应该等待上一个事务完成后再开始下一个事务,并且不会抛出错误(正是我想要的行为)。但是,当计数器字段快速增加时,我仍然收到错误:

10 ABOTED:由于跨事务争用而中止。当多个事务尝试访问相同的数据时会发生这种情况,要求 Firestore 中止至少一个事务以强制可串行化。

我在这里找到了一些关于此错误的解决方案的posts(例如手动延迟写入),但我不确定是否应该使用这些解决方法而不是依赖数据库。我是否误解了悲观并发的用途,或者我的客户端库是否以某种方式改变了这种行为(我找不到任何此类设置)?

我还研究了数据存储限制,但它们似乎也没有提及有关编写一个实体的任何内容(除了旧数据存储限制)。

感谢您的帮助。

node.js google-app-engine google-cloud-datastore datastore
1个回答
0
投票

即使是悲观并发,错误也是有原因的。如果多个事务尝试一起访问相同的数据,它们仍然可能发生冲突。当交易从不同来源开始或快速执行时,就会发生这种情况。

另一点是数据大小。如果数据集很大,数据库可能需要更长的时间来设置锁,从而导致更多冲突。

要解决此问题,请考虑我在文档Firestore 故障排除中找到的以下方法:

  • 对于快速增长的流量,Firestore 尝试自动扩展以满足不断增长的需求。当 Firestore 扩展时,延迟开始减少。

  • 热点限制了 Firestore 扩展的能力,请检查扩展设计以识别热点。

  • 检查交易中的数据争用以及您对交易的使用。

  • 降低单个文档的写入速率。

© www.soinside.com 2019 - 2024. All rights reserved.