To ensure the integrity and consistency of data during a transaction (A transaction is a unit of program that updates various data items, read more about it here), the database system maintains four properties. These properties are widely known as ACID properties.
This property ensures that either all the operations of a transaction reflect in database or none. The logic here is simple, transaction is a single unit, it can’t execute partially. Either it executes completely or it doesn’t, there shouldn’t be a partial execution.
Let’s take an example of banking system to understand this:
Suppose Account A has a balance of 400$ & B has 700$. Account A is transferring 100$ to Account B.
This is a transaction that has two operations
a) Debiting 100$ from A’s balance
b) Creating 100$ to B’s balance.
Let’s say first operation passed successfully while second failed, in this case A’s balance would be 300$ while B would be having 700$ instead of 800$. This is unacceptable in a banking system. Either the transaction should fail without executing any of the operation or it should process both the operations. The Atomicity property ensures that.
There are two key operations are involved in a transaction to maintain the atomicity of the transaction.
Abort: If there is a failure in the transaction, abort the execution and rollback the changes made by the transaction.
Commit: If transaction executes successfully, commit the changes to the database.
Database must be in consistent state before and after the execution of the transaction. This ensures that there are no errors in the database at any point of time. Application programmer is responsible for maintaining the consistency of the database.
A transferring 1000 dollars to B. A’s initial balance is 2000 and B’s initial balance is 5000.
Before the transaction:
Total of A+B = 2000 + 5000 = 7000$
After the transaction:
Total of A+B = 1000 + 6000 = 7000$
The data is consitendct before and after the execution of the transaction so this example maintains the consistency property of the database.
A transaction shouldn’t interfere with the execution of another transaction. To preserve the consistency of database, the execution of transaction should take place in isolation (that means no other transaction should run concurrently when there is a transaction already running).
For example account A is having a balance of 400$ and it is transferring 100$ to account B & C both. So we have two transactions here. Let’s say these transactions run concurrently and both the transactions read 400$ balance, in that case the final balance of A would be 300$ instead of 200$. This is wrong.
If the transaction were to run in isolation then the second transaction would have read the correct balance 300$ (before debiting 100$) once the first transaction went successful.
Once a transaction completes successfully, the changes it has made into the database should be permanent even if there is a system failure. The recovery-management component of database systems ensures the durability of transaction.
ACID properties are the backbone of a database management system. These properties ensure that even though there are multiple transaction reading and writing the data in the database, the data is always correct and consistent. Without ACID properties there is no point in managing the data as it can’t be trusted a used in a transaction.