This guide covers the transaction commands for multi-operation atomicity. For the conceptual overview, see Concepts: Transactions.

Transactions in the CLI

When no transaction is active, commands are executed directly. When a transaction is active, data commands route through the transaction with read-your-writes semantics.

$ strata --db ./data
strata:default/default>

Transaction Lifecycle

Begin

$ strata --cache
strata:default/default> begin
OK

After begin, the CLI takes a snapshot of the current database state. All reads within the transaction see this snapshot plus your own writes.

You can also begin a read-only transaction:

strata:default/default> begin --read-only
OK

Execute Commands

Data commands (KV, Event, State, JSON) route through the transaction:

$ strata --cache
strata:default/default> begin
OK
strata:default/default> kv put key-a 1
(version) 1
strata:default/default> kv get key-a
1

Commit

$ strata --cache
strata:default/default> begin
OK
strata:default/default> kv put key value
(version) 1
strata:default/default> commit
OK

If a conflict occurs:

strata:default/default> commit
(error) TransactionConflict: key was modified by another transaction

Rollback

Explicitly abort a transaction:

strata:default/default> begin
OK
strata:default/default> kv put key value
(version) 1
strata:default/default> rollback
OK

All uncommitted changes are discarded.

Auto-Rollback on Exit

If the CLI session ends (quit, Ctrl-C) while a transaction is active, the transaction is automatically rolled back.

Transaction Scope

Transactional Commands

These commands route through the transaction when one is active:

PrimitiveCommands
KVkv get, kv put, kv del, kv list
Eventevent append, event get, event len
Statestate get, state init, state cas
JSONjson set, json get, json del

Non-Transactional Commands

These always execute directly, regardless of transaction state:

CategoryCommands
VectorAll vector operations
Branchbranch create, branch info, branch list, branch exists, branch del
Databaseping, info, flush, compact

Query Transaction State

$ strata --cache
strata:default/default> begin
OK
strata:default/default> txn info
status: active
strata:default/default> txn active
true
strata:default/default> commit
OK
strata:default/default> txn active
false

Multi-Primitive Atomicity

Transactions span all transactional primitives. You can atomically update KV, State, and Event in a single transaction:

$ strata --cache
strata:default/default> begin
OK
strata:default/default> kv put config:version 2
(version) 1
strata:default/default> state set status updated
(version) 1
strata:default/default> event append config_change '{"version":2}'
(seq) 1
strata:default/default> commit
OK

All three changes commit atomically.

Conflict Retry Pattern

When a transaction conflicts, retry the entire operation. In a shell script:

#!/bin/bash
set -euo pipefail

for attempt in 1 2 3 4 5; do
    strata --db ./data <<'EOF' && break
begin
kv get counter
kv put counter 1
commit
EOF
    echo "Conflict on attempt $attempt, retrying..."
done

In the REPL:

$ strata --db ./data
strata:default/default> begin
OK
strata:default/default> kv get counter
42
strata:default/default> kv put counter 43
(version) 1
strata:default/default> commit
(error) TransactionConflict: key was modified by another transaction
strata:default/default> begin
OK
strata:default/default> kv get counter
43
strata:default/default> kv put counter 44
(version) 1
strata:default/default> commit
OK

Error States

ErrorCause
TransactionAlreadyActiveCalled begin while a transaction is already open
TransactionNotActiveCalled commit or rollback without an active transaction
TransactionConflictCommit-time validation found conflicts with concurrent changes

Next