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 add/deletecommit()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: the transactional collection's add() validates dimension and finiteness at enqueue, throwing DimensionMismatch or InvalidVector. If enqueue succeeds for every op, commit() cannot fail validation.

python
with client.begin_transaction() as txn:
    c = txn.collection("notes")
    c.add(embedding=vector1, metadata={"tag": "a"})
    c.add(embedding=vector2, metadata={"tag": "b"})
    # clean exit -> commit
    # exception  -> rollback (destructor)
cpp
auto txn = db->begin_transaction();
auto& tc = txn.collection("notes");
tc.add(vector1, {{"tag", std::string{"a"}}});
tc.add(vector2, {{"tag", std::string{"b"}}});
txn.commit();   // or txn.rollback();