Skip to content

Transactions

DynamoDB transactions allow you to perform multiple reads or writes atomically — all succeed or all fail together.

transact_write

Execute up to 100 write operations atomically across one or more tables.

from boto3.dynamodb.conditions import Attr
from aiodynamodb import TransactConditionCheck, TransactDelete, TransactPut

await db.transact_write(
    [
        TransactPut(User(user_id="u1", name="Alice")),
        TransactConditionCheck(
            User,
            hash_key="u2",
            condition_expression=Attr("user_id").exists(),
        ),
        TransactDelete(User, hash_key="u3"),
    ],
    client_request_token="req-123",
)

Supported write operations

TransactPut

Puts (insert or replace) an item. Optionally guarded by a condition.

from aiodynamodb import TransactPut

TransactPut(item=User(user_id="u1", name="Alice"))

# With condition
TransactPut(
    item=User(user_id="u1", name="Alice"),
    condition_expression=Attr("user_id").not_exists(),
)

TransactDelete

Deletes an item by key.

from aiodynamodb import TransactDelete

TransactDelete(User, hash_key="u1")

# With range key
TransactDelete(Order, hash_key="o1", range_key="2026-01-01T00:00:00")

# With condition
TransactDelete(User, hash_key="u1", condition_expression=Attr("status").eq("inactive"))

TransactConditionCheck

Asserts a condition on an item without modifying it. Useful to enforce invariants within a transaction.

from aiodynamodb import TransactConditionCheck

TransactConditionCheck(
    User,
    hash_key="u1",
    condition_expression=Attr("balance").gte(100),
)

TransactUpdate

Updates an item within a transaction.

from aiodynamodb import TransactUpdate, UpdateAttr

TransactUpdate(
    User,
    hash_key="u1",
    update_expression={UpdateAttr("login_count").add(1)},
)

transact_write parameters

Parameter Type Default Description
operations list[...] List of TransactPut, TransactDelete, TransactConditionCheck, or TransactUpdate
client_request_token str \| None None Idempotency token (deduplicated within 10 minutes)
return_consumed_capacity bool False Include consumed capacity
return_item_collection_metrics bool False Include item collection metrics

transact_get

Read up to 100 items atomically across one or more tables. Results come back in request order.

from aiodynamodb import ProjectionAttr, TransactGet

items = await db.transact_get(
    [
        TransactGet(User, hash_key="u1"),
        TransactGet(User, hash_key="u2", projection_expression=[ProjectionAttr("user_id")]),
        TransactGet(Order, hash_key="o1", range_key="2026-01-01T00:00:00"),
    ]
)

user_1 = items[0]   # User | None
user_2 = items[1]   # User | None
order  = items[2]   # Order | None

transact_get_items is always strongly consistent — there is no per-item consistency setting in the DynamoDB API.

TransactGet fields

Field Type Description
model type[T] DynamoModel subclass
hash_key KeyT Partition key value
range_key KeyT \| None Sort key value (optional)
projection_expression list[ProjectionAttr] \| None Fields to project

transact_get parameters

Parameter Type Default Description
requests list[TransactGet] Items to read
return_consumed_capacity bool False Include consumed capacity