Skip to main content

Transactions

All operations succeed or all fail. Supports up to 100 items across multiple tables.

Write Transactions

Option 1: Explicit db= on each call

from dkmio import transaction

with transaction.write(db=db) as tx:
tx.put(orders, user_id="usr_1", order_id="ord_1", total=100)
tx.update(orders, user_id="usr_1", order_id="ord_0", set={"status": "REPLACED"})
tx.delete(orders, user_id="usr_1", order_id="ord_old")

# condition_check — validates a condition without modifying the item
tx.condition_check(users, user_id="usr_1", condition={"status__eq": "ACTIVE"})

# condition_check also supports condition_or
tx.condition_check(users, user_id="usr_1",
condition_or=[{"status__eq": "ACTIVE"}, {"status__eq": "VIP"}])

Option 2: set_default() once

db = DynamoDB(region_name="us-east-1")
db.set_default() # register as default for transactions

with transaction.write() as tx: # no db= needed
tx.put(orders, user_id="usr_1", order_id="ord_1", total=100)

with transaction.read() as tx: # no db= needed
tx.get(orders, user_id="usr_1", order_id="ord_1")

Transaction with Conditions

with transaction.write(db=db) as tx:
tx.put(orders, user_id="usr_1", order_id="ord_1", total=100,
condition={"user_id__not_exists": True})
tx.update(orders, user_id="usr_1", order_id="ord_0",
set={"status": "SHIPPED"}, condition={"status__eq": "PENDING"})
tx.delete(orders, user_id="usr_1", order_id="ord_old",
condition={"status__eq": "CANCELLED"})

Read Transactions

with transaction.read(db=db) as tx:
tx.get(orders, user_id="usr_1", order_id="ord_1")
tx.get(users, user_id="usr_1")

# Access results by index after the with block
order = tx[0] # first result (dict or None)
user = tx[1] # second result (dict or None)

# Also iterable
for item in tx:
print(item)