Skip to content

Transactions

ACID transactions across one or more DynamoDB tables. All operations succeed or all fail.

Simple: transact_save

Atomically save multiple items — works across different tables.

user = User(user_id="u1", name="Alice")
order = Order(order_id="o1", amount=99.99)
DynamoModel.transact_save([user, order])

Advanced: transact_write

Combine Put, Delete, and ConditionCheck operations in a single transaction.

from dynantic import Attr, TransactPut, TransactDelete, TransactConditionCheck

DynamoModel.transact_write([
    # Create-if-not-exists
    TransactPut(user, condition=Attr("user_id").not_exists()),
    # Delete with condition
    TransactDelete(Order, condition=Attr("status") == "cancelled", order_id="o1"),
    # Validate without modifying
    TransactConditionCheck(Account, Attr("balance") >= 100, account_id="acc-1"),
])

Real-World Example: Money Transfer

from dynantic import Attr, TransactPut

# Transfer $200 from Alice to Bob atomically
DynamoModel.transact_write([
    TransactPut(
        Account(account_id="acc-1", owner="Alice", balance=800.0),
        condition=(Attr("active") == True) & (Attr("balance") >= 200),
    ),
    TransactPut(
        Account(account_id="acc-2", owner="Bob", balance=700.0),
    ),
    TransactPut(transfer),
])

Atomic Reads: transact_get

Get a consistent snapshot of multiple items.

from dynantic import TransactGet

results = DynamoModel.transact_get([
    TransactGet(User, user_id="u1"),
    TransactGet(Order, order_id="o1"),
])
# results[0] is User | None, results[1] is Order | None

Missing items return None — no exceptions.

100-item limit

DynamoDB limits transactions to 100 items per request. Dynantic validates this and raises ValidationError if exceeded.

Transaction Types

Type Description
TransactPut(model, condition=...) Save an item with optional condition
TransactDelete(ModelClass, condition=..., **keys) Delete by key with optional condition
TransactConditionCheck(ModelClass, condition, **keys) Validate condition without modifying
TransactGet(ModelClass, **keys) Read an item atomically