Search code examples
sqltransactions

Ensuring Atomicity sql


I was just reading about RDBMS, and one property of an RDBMS is atomicity. So, if money is withdrawn from an account and transferred to another, either the transaction will happen completely or not at all. There are no partial transactions. But how is actually ensured?

Sql queries for the above scenario might look like (i) UPDATE accounts set balance = balance - amount WHERE ac_num = 101 (ii) UPDATE accounts set balance = balance + amount WHERE ac_num = 102

Which by no means ensures atomicity.. So how does it actually happen?


Solution

  • If you do

    BEGIN TRANSACTION
    UPDATE accounts set balance = balance - amount WHERE ac_num = 101
    UPDATE accounts set balance = balance + amount WHERE ac_num = 102
    COMMIT TRANSACTION
    

    The database system will write notes to what is has done for changes on account 101. And then if the work on account 102 would fail, the RDBMS uses those notes to undo the work on 101.

    Furthermore, when it has started work on account 101 is takes a lock on the database, so that no-one else can come and read the updated, but not committed data in account 101. (A lock here is basically just a note somewhere "I am working here, do not touch.")