【问题标题】:DynamoBD/Amplify non-negative field and field validation on mutationsDynamoDB/Amplify 非负字段和突变字段验证
【发布时间】:2023-03-20 02:45:01
【问题描述】:

总的来说,我是 AWS 的新手,我正在使用 Amplify 构建一个相对简单的应用程序,但我之前使用过 Google Firebase。我的问题是:有没有办法将字段的约束设置为非负数?我有一个进行交易的应用程序,我不希望我的余额为负数。我只需要一个简单的错误/异常。是否可以在 DynamoDB 中设置“此字段应 >= 0”的字段约束?

我还检查了是否可以在我的 graphql 突变的 VTL 放大生成的解析器中执行此操作,并且确实可以设置一些约束,但不知何故它允许操作并在下一个时崩溃(当平衡数据库上的值已经 = 0”之类的话,但我无法让它工作。

因此,似乎唯一的方法是创建一个自定义 lambda 解析器,在将突变提交到 DynamoDB 之前执行各种检查。我还没有尝试过,但我不明白如何在不进行查询的情况下检查当前余额(存储在数据库中)。

更一般地说,是否可以在 amplify/dynamoDB 上验证字段(即使是简单的断言,如非负)?迁移到像 Aurora 这样的另一个数据库会有帮助吗?

感谢您的帮助

【问题讨论】:

    标签: amazon-dynamodb aws-amplify aws-appsync amplify


    【解决方案1】:

    DynamoDb 支持conditional updates,它允许在满足给定条件时应用更新。您可以为更新设置条件current_balance >= cost。

    但是,负余额不是主要问题。您应该解决的是如何防止其他请求同时更新相同的 current_balance,或者简而言之,防止 current_balance 上的竞争条件。为了解决这个问题,您还需要一个条件更新,其条件是“current_balance = initial_balance”。我猜,initial_balance 是您在购买过程一开始就从 DynamoDB 获得的。

    VTL 代码示例

    #set( $remaining_balance = $initial_balance - $transaction_cost )
    #if( $remaining_balance < 0 )
      $util.error("Insufficient balance")
    #end
    
    {
      "version" : "2018-05-29",
      "operation" : "UpdateItem",
      "key": { <your-dynamodb-key>  },
      "update" : {
        "expression" : "SET current_balance = :remaining_balance",
        "expressionValues" : {
          ":remaining_balance" : $util.dynamodb.toNumberJson($remaining_balance)
        }
      },
      "condition": {
        "expression": "current_balance = :initial_balance",
        "expressionValues" : {
          ":initial_balance" : $util.dynamodb.toNumberJson($initial_balance)
        }
      }
    }
    

    【讨论】:

    • 感谢您的回答!我如何获得 $initial_balance? (这是当前数据库中的内容)据我了解,我必须先进行查询才能获得当前余额(但这种方式会引发各种竞争条件),而且效率很低。我尝试了条件更新设置“:平衡> = 0”,但它让操作发生并阻止下一个(余额已经为0)所以我想我必须将它设置为“:平衡> =成本”对吗?
    • "balance >= 0" 不能确定当前余额是否为 = 成本”是正确的条件。
    • $initial_balance 由另一个 Db 查询检索。我更喜欢原子计数器 SET current_balance = current_balance - cost 的条件更新。原子计数器的问题是它们可以执行两次。您可以使用原子计数器来承受访客计数等不准确的情况。否则,最好使用条件更新。 docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多