All or nothing: transactions
Some changes have to happen together or not at all. Moving budget from one campaign to another is two updates; if only the first one ran, £500 would vanish.
A transaction groups statements so they all succeed or none do:
BEGIN;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
UPDATE marketing_campaigns SET budget = budget + 500 WHERE id = 52;
COMMIT;BEGINstarts the transaction.COMMITmakes the changes permanent.ROLLBACKinstead ofCOMMITundoes everything sinceBEGIN.
If something fails halfway, the database rolls back for you, so you're never left with half a change. Other people using the database don't see your changes until you commit.
In other databases
BEGIN;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
COMMIT;BEGIN TRANSACTION;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
COMMIT;START TRANSACTION;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
COMMIT;BEGIN works too.
BEGIN;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
COMMIT;BEGIN TRANSACTION;
UPDATE marketing_campaigns SET budget = budget - 500 WHERE id = 51;
COMMIT TRANSACTION;