dynamodb多表同时操作数据库事务保证
在操作dynamodb数据库时,存在需要保证多个表更新数据或插入数据都成功,如果使用先后顺序更新或插入很难保证都成功(暂时还不知道dynamodb有回退操作支持),以下以client和resource分别进行dynamodb transact_write_items函数讲解:
- 使用client低级api 同时插入两张表
import boto3
# 使用自己秘钥
db = boto3.client(service_name="dynamodb", region_name="us-west-2", aws_access_key_id="1111111",aws_secret_access_key="2222222")
res = db.transact_write_items(
TransactItems=[
{
'Put': {
'Item': {
"email": {"S": email},
"id": {"S": user_id},
},
"TableName": "user",
"ConditionExpression": "attribute_not_exists(id)",
}
},
{
'Put': {
'Item': {
"email": {"S": email},
"id": {"S": user_id + 1},
},
"TableName": "user_1",
"ConditionExpression": "attribute_not_exists(email)",
}
}
]
)
- 使用resource高级api 同时插入两张表
import boto3
# 使用自己秘钥
db = boto3.resource(service_name="dynamodb", region_name="us-west-2", aws_access_key_id="1111111",aws_secret_access_key="2222222")
res = db.meta.client.transact_write_items(
TransactItems=[
{
'Put': {
'Item': {
"email": email,
"id": user_id,
},
"TableName": "user",
"ConditionExpression": "attribute_not_exists(id)",
}
},
{
'Put': {
'Item': {
"email": email,
"id": user_id + 1,
},
"TableName": "user_1",
"ConditionExpression": "attribute_not_exists(email)",
}
}
]
)
主要区别在于resource可以不指定Item内部属性的类型,会自动进行识别;再者可以使用 meta.client支持低级api
更多相关信息 :https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.get_item