Transactions
Transactions
Stoolap provides full ACID transactions with multi-version concurrency control (MVCC). Transactions ensure that a group of operations either all succeed or all fail, maintaining data consistency.
Auto-Commit Mode
By default, each SQL statement runs in its own implicit transaction and is automatically committed:
-- Each statement is independently committed
INSERT INTO users VALUES (1, 'Alice');
INSERT INTO users VALUES (2, 'Bob');
-- If the second INSERT fails, the first is already committed
Explicit Transactions
Use BEGIN and COMMIT to group multiple statements into a single atomic operation:
BEGIN;
INSERT INTO accounts VALUES (1, 'Alice', 1000);
INSERT INTO accounts VALUES (2, 'Bob', 500);
UPDATE accounts SET balance = balance - 200 WHERE id = 1;
UPDATE accounts SET balance = balance + 200 WHERE id = 2;
COMMIT;
-- All four statements succeed or fail together
ROLLBACK
Use ROLLBACK to discard all changes made within the current transaction:
BEGIN;
DELETE FROM important_data WHERE id = 1;
-- Oops, wrong row!
ROLLBACK;
-- The DELETE is undone, data is intact
Savepoints
Savepoints allow partial rollback within a transaction:
BEGIN;
INSERT INTO orders VALUES (1, 'Order A');
SAVEPOINT sp1;
INSERT INTO orders VALUES (2, 'Order B');
-- Undo only Order B
ROLLBACK TO SAVEPOINT sp1;
-- Order A is still pending
COMMIT;
-- Only Order A is committed
For full savepoint documentation, see Savepoints.
Isolation Levels
Stoolap supports two isolation levels:
READ COMMITTED (Default)
Each statement sees data committed before the statement began. Different statements within the same transaction may see different snapshots:
BEGIN;
SELECT * FROM accounts; -- Sees data as of this moment
-- Another transaction commits changes here
SELECT * FROM accounts; -- May see the new changes
COMMIT;
SNAPSHOT (Repeatable Read)
The entire transaction sees a consistent snapshot from when it began. No changes from other transactions are visible:
BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM accounts; -- Sees data as of BEGIN
-- Another transaction commits changes here
SELECT * FROM accounts; -- Still sees data as of BEGIN
COMMIT;
Isolation Level Aliases
The following SQL-standard isolation levels are accepted as aliases:
| Alias | Maps To |
|---|---|
REPEATABLE READ |
SNAPSHOT |
SERIALIZABLE |
SNAPSHOT |
READ UNCOMMITTED |
READ COMMITTED |
-- All equivalent - start a snapshot isolation transaction
BEGIN TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Transaction Behavior with DDL
DDL statements (CREATE TABLE, DROP TABLE, ALTER TABLE) can participate in explicit transactions:
BEGIN;
CREATE TABLE temp_results (id INTEGER PRIMARY KEY, value TEXT);
INSERT INTO temp_results VALUES (1, 'result');
-- Both the table creation and insert are committed together
COMMIT;
Setting Default Isolation Level
Use SET to change the default isolation level for the session:
-- Set default to SNAPSHOT for all subsequent transactions
SET isolation_level = 'SNAPSHOT';
-- Reset to default
SET isolation_level = 'READ COMMITTED';
Both isolation_level and transaction_isolation are accepted as variable names. If called within an active transaction, the isolation level is changed for that transaction only.
Transaction Behavior Summary
| Statement | Behavior |
|---|---|
BEGIN |
Starts an explicit transaction with default isolation |
BEGIN TRANSACTION ISOLATION LEVEL ... |
Starts a transaction with specified isolation level |
COMMIT |
Commits all pending changes |
ROLLBACK |
Discards all pending changes |
SAVEPOINT name |
Creates a named savepoint |
ROLLBACK TO SAVEPOINT name |
Rolls back to the savepoint |
RELEASE SAVEPOINT name |
Removes a savepoint |
SET isolation_level = '...' |
Sets default isolation level for the session |
Concurrency
Stoolap uses MVCC (Multi-Version Concurrency Control) to handle concurrent transactions:
- Readers never block writers
- Writers never block readers
- Write conflicts are detected at commit time
- Each transaction sees a consistent view of the data based on its isolation level
For architectural details on MVCC, see MVCC Implementation.