在本文中,我将向您展示DynamoDB交易是如何用于提供酸(原子能,一致性,隔离和耐用性)支持的方式,这将有助于您维护业务复杂应用程序中的数据完整性。
Amazon DynamoDB交易仅适用于一个帐户和同一区域。
-
读取和写作动作已经完成,以使他们所有人都成功,要么没有成功。
-
没有额外的费用可以为您的DynamoDB表启用交易。
-
您只为交易中的读取或写入付款。
-
交易中项目的汇总大小不能超过4 MB。
-
无法使用索引进行交易。
transactwriteItems api 是一种同步写操作,在单个全或全部的操作中分组多达100个写作动作。
-
您可以在成功或失败的单个TransActWriteItems操作中分组多个PUT,更新,删除和条件检查操作。
-
没有两个动作可以针对同一项目。例如,您不能同时conditioncheck和更新同一项目。
-
这些动作可以在一个或多个DynamoDB表中包含多达100个不同的项目。
-
所有这些动作都包括表的名称,如果未满足条件,则指示是否检索/update/delete/delete/condececheck the项目的属性,并且必须满足写入/必须满足的可选条件表达式更新/删除/条件检查成功。
put <顾名思义,它写了一个新项目,这是该项目的主要键。它包括该项目属性的列表
update <顾名思义,它会更新项目的现有主键,或者如果还不存在,则会添加新项目。它包括一个定义要更新的属性
的字段delete <顾名思义,它删除了现有项目的主要键。
conditioncheck <顾名思义,它仅检查项目的主要键。
dynamoDB如果以下任何一个是正确的:
-
未满足条件表达式之一的条件。
-
当交易验证错误(TransactionCanceLedException)发生时,因为在同一TransactWriteItems操作中的多个动作目标是同一项目。
-
完成交易的配置能力不足。
-
项目大小变得太大(大于400 kb),局部次要索引(LSI)变得太大,或者由于交易的更改而发生类似的验证错误。
li> -
有一个用户错误,例如无效的数据格式。
transactgetItems api 是一种同步读取操作,该操作将多达100个组合在一起。
-
您可以在成功或失败的单个TransActWriteItems操作中分组多个PUT,更新,删除和条件检查操作。
-
没有两个动作可以针对同一项目。例如,您不能同时conditioncheck和更新同一项目。
-
这些动作可以在一个或多个DynamoDB表中包含多达100个不同的项目。
get 'hat the Shand所暗示,它用给定的主键检索了该项目的一组属性。如果找不到匹配的项目,则获得不返回任何数据。
- 它包括用于阅读的错误处理
请访问我的 GitHub Repository for DynamoDB articles 有关各种主题的不断更新。
让我们开始!
目标:
1。创建一个DynamoDB表主键/分区键和使用 create_table.py
的排序键2。创建一个python文件 - transact_write_items.py 将交易项目写入DynamoDB表
3。创建一个python文件 - transact_get_items.py 从dynamodb表中获取项目
4。
Amazon DynamoDB可以与其他AWS服务集成。 我已经广泛使用了本会话的boto3文档 请参阅我以前的文章有关DynamoDB table works with different methods using Python scripts and boto3的方式 复制Python脚本的相应代码,并将它们保存在Cloud9目录中。 从1-3 当未满足条件表达式之一的条件时。 发生交易验证错误时,因为在同一TransactWriteItems操作中有多个操作针对同一项目。 运行相同的文件 - transact_write_items.py再次 我们已经成功地展示了DynamoDB交易是如何通过同时运行操作来保持数据完整性的读取和写入API的,因此所有这些操作都成功或没有成功。
先决条件:
使用的资源:
boto3文档 - Boto3 Docs 1.26.26 documentation
该项目实施的步骤:
1.创建DynamoDB表主键/分区键和使用 create_table.py 的排序键
#!/usr/bin/env python3.7
# create_table.py
# Get the method create_table() to create table "movies", and print data from table
# To use Boto3, you must first import AWS Python SDK
import boto3
# A low-level client representing DynamoDB
dynamodb_client=boto3.client('dynamodb')
# use the DynamoDB.ServiceResource.create_table() method:
# then indicate which service or services you're going to use:
# Get the service resource.
dynamodb = boto3.resource('dynamodb')
# Create the DynamoDB table.
table = dynamodb.create_table(
TableName='movies',
KeySchema=[
{
'AttributeName': 'id',
'KeyType': 'HASH'
},
{
'AttributeName': 'director',
'KeyType': 'RANGE'
}
],
AttributeDefinitions=[
{
'AttributeName': 'id',
'AttributeType': 'S'
},
{
'AttributeName': 'director',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
# Wait until the table exists.
table.wait_until_exists()
# Print out data about the table.
print('DynamoDB Table', '=> ', table.table_name, ' created.')
2.创建一个python文件 - transact_write_items.py 将交易项目写入dynamodb表中
#!/usr/bin/env python3.7
# transact_write_items.py
from __future__ import print_function # Python 2/3 compatibility
import boto3, json
from botocore.exceptions import ClientError
client = boto3.client('dynamodb', region_name='us-east-1')
try:
response = client.transact_write_items(
TransactItems=[
{
'Put': {
'TableName': 'movies',
'Item': {
'id': {
'S': '1'
},
'director': {
'S': 'Yash'
},
'user': {
'S': 'Rev'
},
'other': {
'S': 'Fun working'
},
},
'ConditionExpression': 'attribute_not_exists(id)',
}
},
{
'Update': {
'TableName': 'movies',
'Key': {
'id': {
'S': '2'
},
'director': {
'S': 'Rishikesh'
}
},
'UpdateExpression': 'SET #o = :val',
'ExpressionAttributeValues': {
':val': {
'S': 'updated value'
}
},
'ExpressionAttributeNames': {
'#o': 'Other'
}
}
}
]
)
except ClientError as e:
print(e)
print(e.response['Error']['Message'])
else:
print("Transact Write succeeded")
3.创建一个python文件 - transact_get_items.py 从dynamodb表中获取项目
#!/usr/bin/env python3.7
#transact_get_items.py
from __future__ import print_function # Python 2/3 compatibility
import boto3, json, decimal
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError
client = boto3.client('dynamodb', region_name='us-east-1')
try:
response = client.transact_get_items(
TransactItems=[
{
'Get': {
'TableName': "movies",
'Key': {
'id': {
'S': '1'
},
'director': {
'S': "Yash"
},
},
},
},
{
'Get': {
'TableName': "movies",
'Key': {
'id': {
'S': "2"
},
'director': {
'S': "Rishikesh"
},
},
},
},
]
)
print(json.dumps(response))
except ClientError as e:
print(e.response['Error']['Message'])
4.验证两个方法中的某些操作-transact_write_items()和transact_get_items()
方法 - transact_write_items()
方法transact_get_items()
#!/usr/bin/env python3.7
#transact_get_items.py
# Modify the spelling of the table 'movies' to 'Movies'
from __future__ import print_function # Python 2/3 compatibility
import boto3, json, decimal
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError
client = boto3.client('dynamodb', region_name='us-east-1')
try:
response = client.transact_get_items(
TransactItems=[
{
'Get': {
'TableName': "Movies",
'Key': {
'id': {
'S': '1'
},
'director': {
'S': "Yash"
},
},
},
},
{
'Get': {
'TableName': "movies",
'Key': {
'id': {
'S': "2"
},
'director': {
'S': "Rishikesh"
},
},
},
},
]
)
print(json.dumps(response))
except ClientError as e:
print(e.response['Error']['Message'])
清理
delete_table.py
#!/usr/bin/env python3.7
# delete_table.py
# delete the table - movies
# To use Boto3, you must first import AWS Python SDK
import boto3
# A low-level client representing DynamoDB
dynamodb = boto3.client('dynamodb')
# delete the table movies
response = dynamodb.delete_table(
TableName='movies'
)
rm transact_write_items.py
rm transact_get_items.py
到目前为止我们所做的