现在我正在React中开发一个Amplify应用程序,它显示从DynamoDB获取的数据。每一行都有一个唯一的id。用户可以修改行并将其提交到数据库。
我想在编辑行时实现一个悲观锁。
正如其他问题中所述,dynamodb默认不支持悲观锁定,如果我错了,请纠正我。
这个用例的最佳实践是什么?
我的想法,如何做到这一点:
- 第二个DynamoDB表,它保存行的锁(id(
- 有可能在所有的放大会议上都有一个全局变量吗?您可以将行的锁(id(存储在此全局变量中
- 后备措施是乐观锁定
我很想听听你对这个话题的看法!:(
欢迎使用堆栈溢出:(
通常,没有数据库真正";支持";悲观的锁定开箱即用。SQL数据库的乐观和悲观锁定通常在ORM或某个应用程序端库中完成。数据库只提供实现它们所需的基元。
DynamoDB也是如此!
老实说,我只是实现了乐观地锁定自己。对于悲观锁定,可能有一些事情需要考虑,我对如何解决没有任何想法,比如锁定时间,以防某个东西被锁定,再也无法解锁?
总之,一般来说,这些事情都可以使用条件表达式来实现。
要在项目上创建锁,请使用条件表达式来确保没有设置锁:
const itemLockId = uuidv4()
ddb.updateItem({
TableName: "...",
Key: {
Id: "my-id-thingie-here"
},
UpdateExpression: "SET ItemLockId= :itemLockId",
ConditionExpression: "attribute_not_exists(ItemLockId)",
ExpressionAttributeValues: {
":itemLockId": itemLockId
}
})
稍后,您可以放置项目,检查它是否未锁定并移除锁定(通过在属性中不指定任何ItemLockId(:
ddb.putItem({
TableName: "...",
Item: {
Id: "my-id-thingie-here",
Attr1: "my value",
Attr2: 123
// ItemLockId not specified, so it will be deleted
},
ConditionExpression: "ItemLockId = :itemLockId",
ExpressionAttributeValues: {
":itemLockId": itemLockId
}
})
如果锁在数据库中的值与您请求锁时获得的值不同,则此put将失败。
希望这是有帮助的,祝你好运:(