DynamoBD/Amplify 非负字段和字段验证突变
DynamoBD/Amplify non-negative field and field validation on mutations
总的来说,我是 AWS 的新手,我正在使用 Amplify 构建一个相对简单的应用程序,但我之前使用过 Google Firebase。我的问题是:有没有办法为字段设置非负约束?我有一个进行交易的应用程序,我不希望我的余额为负数。我只需要一个简单的error/exception。是否可以在 DynamoDB 中设置一个字段约束,表示“此字段应 >= 0”?
我还检查了是否可以在我的 graphql 突变的 VTL 放大生成的解析器中执行此操作,并且确实可以设置一些约束,但不知何故它允许操作并在下一个操作时崩溃(当数据库上的余额已经 < 0,就像它在更新之前检查它一样)。我试着说类似“current_balance - transaction >= 0”之类的话,但我无法让它工作。
所以似乎唯一的方法是创建一个自定义的 lambda 解析器,它在将变更提交给 DynamoDB 之前进行各种检查。我还没有尝试过,但我不明白如何在不进行查询的情况下检查当前余额(存储在数据库中)。
一般来说,甚至可以在 amplify/dynamoDB 上验证字段(即使使用简单的断言,如非负)?移动到另一个像 Aurora 这样的数据库会有帮助吗?
谢谢你的帮助
DynamoDb 支持 conditional updates,这允许在满足给定条件时应用更新。您可以为您的更新设置条件current_balance >= cost
。
不过,负余额并不是主要问题。您应该解决的是如何防止其他请求同时更新相同的 current_balance,或者简而言之,[=25= 上的竞争条件]。为了解决这个问题,您还需要一个条件更新,其条件为“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)
}
}
}
总的来说,我是 AWS 的新手,我正在使用 Amplify 构建一个相对简单的应用程序,但我之前使用过 Google Firebase。我的问题是:有没有办法为字段设置非负约束?我有一个进行交易的应用程序,我不希望我的余额为负数。我只需要一个简单的error/exception。是否可以在 DynamoDB 中设置一个字段约束,表示“此字段应 >= 0”?
我还检查了是否可以在我的 graphql 突变的 VTL 放大生成的解析器中执行此操作,并且确实可以设置一些约束,但不知何故它允许操作并在下一个操作时崩溃(当数据库上的余额已经 < 0,就像它在更新之前检查它一样)。我试着说类似“current_balance - transaction >= 0”之类的话,但我无法让它工作。
所以似乎唯一的方法是创建一个自定义的 lambda 解析器,它在将变更提交给 DynamoDB 之前进行各种检查。我还没有尝试过,但我不明白如何在不进行查询的情况下检查当前余额(存储在数据库中)。
一般来说,甚至可以在 amplify/dynamoDB 上验证字段(即使使用简单的断言,如非负)?移动到另一个像 Aurora 这样的数据库会有帮助吗?
谢谢你的帮助
DynamoDb 支持 conditional updates,这允许在满足给定条件时应用更新。您可以为您的更新设置条件current_balance >= cost
。
不过,负余额并不是主要问题。您应该解决的是如何防止其他请求同时更新相同的 current_balance,或者简而言之,[=25= 上的竞争条件]。为了解决这个问题,您还需要一个条件更新,其条件为“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)
}
}
}