Example 1
Transfer funds between accounts atomically
Alice's balance decreases by 100 and Bob's increases by 100. Both updates are committed together. If either update had failed, a ROLLBACK would have reverted both — keeping the total balance consistent. Replace COMMIT with ROLLBACK to undo both changes instead.
CREATE TABLE accounts (id INT, name VARCHAR(50), balance INT);
INSERT INTO
accounts (id, name, balance)
VALUES
(1, 'Alice', 1000),
(2, 'Bob', 500);START TRANSACTION;
UPDATE accounts
SET
balance = balance - 100
WHERE
id = 1;
UPDATE accounts
SET
balance = balance + 100
WHERE
id = 2;
COMMIT;
SELECT
id,
name,
balance
FROM
accounts
ORDER BY
id;| id | name | balance |
|---|---|---|
| 1 | Alice | 900 |
| 2 | Bob | 600 |
CREATE TABLE accounts (id INT, name VARCHAR(50), balance INT);
INSERT INTO
accounts (id, name, balance)
VALUES
(1, 'Alice', 1000),
(2, 'Bob', 500);BEGIN TRANSACTION;
UPDATE accounts
SET
balance = balance - 100
WHERE
id = 1;
UPDATE accounts
SET
balance = balance + 100
WHERE
id = 2;
COMMIT;
SELECT
id,
name,
balance
FROM
accounts
ORDER BY
id;| id | name | balance |
|---|---|---|
| 1 | Alice | 900 |
| 2 | Bob | 600 |
CREATE TABLE accounts (id INT, name VARCHAR(50), balance INT);
INSERT INTO
accounts (id, name, balance)
VALUES
(1, 'Alice', 1000),
(2, 'Bob', 500);BEGIN;
UPDATE accounts
SET
balance = balance - 100
WHERE
id = 1;
UPDATE accounts
SET
balance = balance + 100
WHERE
id = 2;
COMMIT;
SELECT
id,
name,
balance
FROM
accounts
ORDER BY
id;| id | name | balance |
|---|---|---|
| 1 | Alice | 900 |
| 2 | Bob | 600 |
SQL Server uses BEGIN TRANSACTION, MySQL/MariaDB use START TRANSACTION, and PostgreSQL uses BEGIN. The resulting data is identical across engines.