【发布时间】:2020-12-15 23:57:17
【问题描述】:
很明显,Dynamo 在并行运行更新/删除时不是线程安全的(除非使用乐观更新锁定或条件写入)。
我想知道的是,在一个接一个地运行更新而没有任何顺序暂停时是否存在一致性问题的风险,像这样(Javascript):
await dynamo
.put({ // PUT creates a record if it doesn't exist
TableName: "table-name",
Item: {
id,
value: "some value"
}
})
.promise();
await dynamo
.delete({
TableName: "table-name",
Key: {
id
}
})
.promise();
// wait for X seconds for eventual consistency here
const result = await dynamo
.get({
TableName: "table-name",
Key: {
id
}
})
.promise();
if (result.Item) {
throw new Error('Oh no, record should have been deleted!');
}
我已经运行了这段代码 1000 次,结果表明在这种情况下可以依赖 Dynamo 来按预期运行(最后更新/删除获胜),但我想确定(文档的链接?)。
更新:换句话说,我想知道当更新发生得很快时,Dynamo 是否保证遵守我发送更新的顺序。
【问题讨论】:
-
这很有帮助,似乎表明我的预期是正确的,引用:“如果您在短时间内重复读取请求,则响应应该返回最新数据”。但是,它并没有具体提到一个接一个地快速发生的更新。我在想——也许 Dynamo 在执行 DELETE 之前需要在内部读取?如果它在数据库还没有变得一致的时候读取,它可能会“认为”没有什么可以删除?
-
维基百科对“最终一致性”的定义也不给我乐观:“最终一致性是分布式计算中用于实现高可用性的一致性模型,它非正式地保证,如果没有新的更新给定的数据项,最终对该项的所有访问都将返回最后更新的值”。请注意定义中的“无新更新”部分
标签: database amazon-dynamodb eventual-consistency