elips/docs
Chapter V · the query layer

Transactions

ELIPS validates every operation as you enqueue it, so commit() is a pure write.

entrybegin_transaction()db.begin_transaction()ACTIVEdone_=false · ops_=[]enqueue place/erasecommit()for op : ops_ → WAL+applyROLLED BACKops_.clear() · done_=T~Transaction()auto-rollback if !done_TERMINAL · done_=trueno further ops · safe to destroyRAII: no done_ → rollback ✓
Three terminal paths: commit, rollback, or destructor-rollback. done_ flips once.

From docs/cpp/api-reference/transaction.md: TransactionVault::place() validates dimension and finiteness at enqueue, throwing DimensionMismatch or InvalidVector. If enqueue succeeds for every op, commit() cannot fail validation.

python
with db.begin_transaction() as txn:
    v = txn.vault("notes")
    v.place(vector1, {"tag": "a"})
    v.place(vector2, {"tag": "b"})
    # clean exit -> commit
    # exception  -> rollback (destructor)
cpp
auto txn = db->begin_transaction();
auto& tv = txn.vault("notes");
tv.place(vector1, {{"tag", std::string{"a"}}});
tv.place(vector2, {{"tag", std::string{"b"}}});
txn.commit();   // or txn.rollback();