Skip to main content
Version: 1.x

Transactions

Each statement within SurrealDB is run within its own transaction. If a set of changes need to be made together, then groups of statements can be run together as a single transaction, either succeeding as a whole, or failing without leaving any residual data modifications.

Note: SurrealDB only supports transaction statements as top-level statements, not as a part of function bodies, blocks, or subqueries.

Starting a transaction

The BEGIN TRANSACTION statement can be used to run a group of statements together, either succeeding as a whole, or failing. If all of the statements within a transaction succeed, and the transaction is successful, then all of the data modifications made during the transaction are committed and become a permanent part of the database. If a transaction encounters errors and must be cancelled or rolled back, then any data modification made within the transaction is rolled back, and will not be visible within the database.

Starting a transaction
BEGIN [ TRANSACTION ];

The following query shows example usage of this statement.

Example usage of BEGIN TRANSACTION
-- Start a new database transaction. Transactions are a way to ensure multiple operations
-- either all succeed or all fail, maintaining data integrity.
BEGIN TRANSACTION;

-- Create a new account with the ID 'one' and set its initial balance to 135605.16
CREATE account:one SET balance = 135605.16;

-- Create another new account with the ID 'two' and set its initial balance to 91031.31
CREATE account:two SET balance = 91031.31;

-- Update the balance of account 'one' by adding 300.00 to the current balance.
-- This could represent a deposit or other form of credit on the balance property.
UPDATE account:one SET balance += 300.00;

-- Update the balance of account 'two' by subtracting 300.00 from the current balance.
-- This could represent a withdrawal or other form of debit on the balance property.
UPDATE account:two SET balance -= 300.00;

-- Finalize the transaction. This will apply the changes to the database. If there was an error
-- during any of the previous steps within the transaction, all changes would be rolled back and
-- the database would remain in its initial state.
COMMIT TRANSACTION;

Cancelling a transaction

The CANCEL TRANSACTION statement can be used to cancel a set of statements within a transaction, reverting or rolling back any data modification made within the transaction as a whole.

Cancelling a transaction
CANCEL [ TRANSACTION ];

The following query shows example usage of this statement.

Example usage of CANCEL TRANSACTION
BEGIN TRANSACTION;
-- Setup accounts
CREATE account:one SET balance = 135605.16;
CREATE account:two SET balance = 91031.31;
-- Move money
UPDATE account:one SET balance += 300.00;
UPDATE account:two SET balance -= 300.00;
-- Rollback all changes
CANCEL TRANSACTION;

Committing a transaction

The COMMIT TRANSACTION statement can be used to commit a set of statements within a transaction, ensuring that all data modifications become a permanent part of the database.

Committing a transaction
COMMIT [ TRANSACTION ];

The following query shows example usage of this statement.

Example usage of COMMIT TRANSACTION
BEGIN TRANSACTION;
-- Setup accounts
CREATE account:one SET balance = 135605.16;
CREATE account:two SET balance = 91031.31;
-- Move money
UPDATE account:one SET balance += 300.00;
UPDATE account:two SET balance -= 300.00;
-- Finalise all changes
COMMIT TRANSACTION;

THROW to conditionally cancel a transaction

While transactions are automatically rolled back if an error occurs in any of its statements, THROW can also be used to explicitly break out of a transaction at any point.

BEGIN TRANSACTION;
LET $transfer_amount = 150;
CREATE account:one SET dollars = 100;
CREATE account:two SET dollars = 100;
UPDATE account:one SET dollars -= $transfer_amount;
UPDATE account:two SET dollars += $transfer_amount;
IF account:one.dollars < 0 {
THROW "Insufficient funds, would have $" + <string>account:one.dollars + " after transfer"
};
COMMIT TRANSACTION;
SELECT * FROM account;
Output when $transfer_amount set to 150
'An error occurred: Insufficient funds, would have $-50 after transfer'
Output when $transfer_amount set to 50
[
{
dollars: 50,
id: account:one
},
{
dollars: 150,
id: account:two
}
]