事务:一个操作,一个要执行SQL语句,要么执行,要么不执行,是一个不可分割的工作单位。
有如下特性:
A:原子性(atomicity)
C:一致性(consistency)
I:隔离性(isolation)
D:持久性(durability)
先理解数据库的一致性
参考这篇博客
https://www.cnblogs.com/ivanpan/p/6653990.html
考虑如下场景:
公司给员工发工资
1、财务处确认给你发的工资是多少
2、确认公司账户有多少资金
3、像银行发起转账申请,银行扣除学校财务卡上的指定金额
4、银行向员工工资卡中打入指定金额
5、银行汇报双方交易完成
如果执行第3步的时候,突然大断电,整个电力系统进入瘫痪。待电力系统恢复之后,银行并不会执行4,5,甚至连1,2,3的操作记录都对视。此时出现如下问题
1、学校认为,工资已经发出
2、A老师认为,学校还没有发工资
3、银行认为,从来就没有发生过转账的事情
其实整个过程可以用一个词来描述:数据库中的数据产生了“不一致性”,即在转钱的前后要保证钱的总量要一致。
还有要保证数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的
原子性:因为要满足要么执行,要么不执行,所以事务要么执行,要么不执行,是不可再分割的工作单元。
隔离性:多个事务并发访问时,事务之间是隔离的。
具体的有几种事务隔离级别,请看数据库复习之事务隔离级别
有的隔离并发事务所做的修改要和其他并发事务隔离。这是最基本的,如果这都不能保证,银行存钱就不准了。
一个事务修改数据,另一个事务查看数据时只能查看到修改前的数据或者修改后的数据,不能看到中间状态的数据。不然就会读到脏数据。
完全的隔离就要求串行化,这样会严重影响性能。
持久性:事务一旦提交,对数据库中数据的改变是永久性的。