Expand description
Transaction management with MVCC and Snapshot Isolation.
§Isolation Level
Graphos provides Snapshot Isolation (SI), which offers strong consistency guarantees while maintaining high concurrency. Each transaction sees a consistent snapshot of the database as of its start time.
§Guarantees
- Read Consistency: A transaction always reads the same values for the same entities throughout its lifetime (repeatable reads).
- Write-Write Conflict Detection: If two concurrent transactions write to the same entity, the second to commit will be aborted.
- No Dirty Reads: A transaction never sees uncommitted changes from other transactions.
- No Lost Updates: Write-write conflicts prevent the lost update anomaly.
§Limitations (Write Skew Anomaly)
Snapshot Isolation does not provide full Serializable isolation. The “write skew” anomaly is possible when two transactions read overlapping data but write to disjoint sets:
Initial state: A = 50, B = 50, constraint: A + B >= 0
T1: Read A, B → both 50
T2: Read A, B → both 50
T1: Write A = A - 100 = -50 (valid: -50 + 50 = 0)
T2: Write B = B - 100 = -50 (valid: 50 + -50 = 0)
T1: Commit ✓
T2: Commit ✓ (no write-write conflict since T1 wrote A, T2 wrote B)
Final state: A = -50, B = -50, constraint violated: A + B = -100 < 0§Workarounds for Write Skew
If your application has invariants that span multiple entities, consider:
- Promote reads to writes: Add a dummy write to entities you read if you need them to remain unchanged.
- Application-level locking: Use external locks for critical sections.
- Constraint checking: Validate invariants at commit time and retry if violated.
§Epoch-Based Versioning
Graphos uses epoch-based MVCC where:
- Each commit advances the global epoch
- Transactions read data visible at their start epoch
- Version chains store multiple versions for concurrent access
- Garbage collection removes versions no longer needed by active transactions
§Example
ⓘ
let tx = session.begin_transaction()?;
// All reads see a consistent snapshot
let result = session.execute("MATCH (n:Person) RETURN n")?;
// Writes are isolated until commit
session.execute("CREATE (n:Person {name: 'Alice'})")?;
// Commit may fail if write-write conflict detected
session.commit()?;Structs§
- Transaction
Manager - Manages transactions and MVCC versioning.
- TxInfo
- Information about an active transaction.
- Version
- A single version of data.
- Version
Chain - A chain of versions for a single entity.
- Version
Info - Visibility information for a version.