DynamoDB在Amplify/React中的悲观锁定



现在我正在React中开发一个Amplify应用程序,它显示从DynamoDB获取的数据。每一行都有一个唯一的id。用户可以修改行并将其提交到数据库。

我想在编辑行时实现一个悲观锁。

正如其他问题中所述,dynamodb默认不支持悲观锁定,如果我错了,请纠正我。

这个用例的最佳实践是什么?

我的想法,如何做到这一点:

  1. 第二个DynamoDB表,它保存行的锁(id(
  2. 有可能在所有的放大会议上都有一个全局变量吗?您可以将行的锁(id(存储在此全局变量中
  3. 后备措施是乐观锁定

我很想听听你对这个话题的看法!:(

欢迎使用堆栈溢出:(

通常,没有数据库真正";支持";悲观的锁定开箱即用。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将失败。

希望这是有帮助的,祝你好运:(

最新更新