MySQL高级第十二篇:数据库事物概述和隔离级别
- 一、数据库事物概述
- 1. SHOW ENGINES 查看存储引擎
- 2. 事物ACID特性
- 原子性(atomiity)
- 一致性(consistency):
- 隔离性(isolation)
- 持久性(durability):
- 总结
- 3. 事物的状态
- 二、事物的隔离级别
一、数据库事物概述
- 事物:一组逻辑操作单元,使数据从一种状态变成另一种状态,这一组逻辑操作要么全部成功,要么全部放弃。
1. SHOW ENGINES 查看存储引擎
可以看出,在MySQL中,只有 InnoDB 支持事物。
2. 事物ACID特性
原子性(atomiity)
- 原子性是指
事务是一个不可分割的工作单位
,要么全部提交,要么全部失败回滚。 - 比如银行卡转账,要么转账成功,要么转账失败,不存在中间的状态。如果无法保证原子性,就会出现数据不一致的情形,A账户减去100元,而B账户增加100元操作失败,系统将无故丢失100元。
一致性(consistency):
- 一致性是指
事务执行前后,数据从一个 合法性状态 变换到 另外一个合法性状态
。这种状态是语义上的,而不是语法上的,跟具体的业务有关。 - 什么是合法的数据状态?满足预定的约束的状态就叫做合法的状态。通俗一点,这状态是由你自己来定义的
(比如满足现实世界中的约束)。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!如果事务中的某个操作失败了,系统就会自动撤销当前正在执行的事务,返回到事务操作之前的状态。 - 比如,还是银行卡转账,要转账,你的余额就要大于0,并且转账金额不能大于余额,比如你有100,却想转出200,当然不行了,账户肯定不能为 -100,这就叫数据一致性。
隔离性(isolation)
- 事务的隔离性是指
一个事务的执行不能被其他事务干扰
,即一个事务内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):
- 持久性是指
一个事务一旦被提交,它对数据库中数据的改变就是永久性的
,接下来的其他操作和数据库故障不应
该对其有任何影响。 - 持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。
- 这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。
总结
- ACID是事务的四大特性,在这四个特性中,
原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的
。
3. 事物的状态
-
活动的(active)
- 事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态。
-
部分提交的(partially committed)
- 当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。
-
提交的(committed)
- 当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态。
-
失败的(failed)
- 当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态。
-
中止的(aborted)
- 如果事务执行了一部分而变为失败的状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状
态。 - 换句话说,就是要撤销失败事务对当前数据库造成的影响。我们把这个撤销的过程称之为回滚。当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态。
- 如果事务执行了一部分而变为失败的状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状
二、事物的隔离级别
读未提交
- 所有事物都可以看到其他未提交事物的执行结果
- 问题:脏读、幻读、不可重复读
读已提交
- 只能看到已经提交的事物所做出的改变
- 解决:脏读
- 问题:幻读、不可重复读
可重复读
(MySQL默认)- 事物A读到一条数据后,事物B对该数据进行了修改并提交,事物A再读该数据,读到的还是原来内容
- 解决:脏读、不可重复读
- 问题:幻读
序列化/串行化
- 确保事物可以从一个表中读取相同的行,在此事物执行期间,禁止其他事物操作
- 解决:脏读、幻读、不可重复读
- 问题:性能低