事务的定义
事务是一组原子性的SQL查询,或者说一个独立的工作单元。
生活中的例子
假设一个银行的数据库有两张表:支票(checking)表和储蓄(savings)表。从某个用户的支票账户转移200元到储蓄账户,需要至少3个步骤:
1 检查支票账户的余额至少有200元。
2 支票账户余额减去200元。
3 储蓄账户余额增加200元。
上述3个步骤的操作必须打包在一个事务中,对应的事务SQL语句如下:(commit对应rollback)
1 start transaction;
2 select balance from checking where customer_id = 10;
3 update checking set balance = balance - 200
4 where customer_id = 10;
5 update savings set balance = balance + 200
6 where customer_id = 10;
7 commit;
事务的ACID特性
原子性
整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
一致性
数据库总是从一个一致性状态转换到另外一个一致性状态。在前面的例子中,如果执行完第3条语句、第4条语句还未开始时系统崩溃,支票账户不会损失200元,因为事务没有提交,所以事务中所做的修改不会保存到数据库中。
隔离性
一个事务所做的修改在提交以前,对其他事务是不可见的。在前面的例子中,如果执行完第3条语句、第4条语句还未开始时,有另外一个事务查询了支票账户余额,则会看到余额没有减少200元。
持久性
事务提交后其所做的修改会永久保存到数据库中。
参考资料
《高性能MySQL》 P6-7