事务就是一组原子性的sql查询,或者说是一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或者其他原因无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
银行转账很好的体现了事务的必要性。例如一个银行的数据库有2张表:支票表(checking)表和储蓄(savings)表。现在要从用户Jane的支票账户转移200美元到他的储蓄账户,那么现在至少需要3个步骤才能完成该操作:
1、检查支票账户的余额高于200美元;
2、从支票账户余额中减去200美元;
3、在储蓄账户余额中增加200美元。
上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。
可以用start transaction语句开始一个事务,然后使用commit提交事务,将修改的数据持久保留,要么使用rollback撤销所有的修改。上述银行转账实例的sql语句如下:
start transaction;
select balance from checking where customer_id = 12344;
update checking set balance = balance - 200 where customer_id = 12344;
update savings set balance = balance + 200 where customer_id = 12344;
commit;
为了保障用户的财产安全,同时也为了银行的利益不受损失,系统必须通过严格的ACID测试,否则空谈事务的概念是不够的。