事务~~~
1、四大特性:
A 原子性:对数据的一组操作,要么执行成功,要么不执行
C 一致性:事务前后的状态要保持一致,可以理解为数据的一致性
I 隔离性:多个事务之间是隔离的,互不影响
D 持久性:事务中对数据库执行的修改操作都将在磁盘上保留下来
只有保证了原子性、隔离性、持久性才能保证事务的一致性。
2、事务的状态:
- 活动的(active):事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态。
- 部分提交的(partially committed):当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。
- 失败的(failed):当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态。
- 中止的(aborted):如果事务执行了半截而变为失败的状态,比如我们前边唠叨的狗哥向猫爷转账的事务,当狗哥账户的钱被扣除,但是猫爷账户的钱没有增加时遇到了错误,从而当前事务处在了失败的状态,那么就需要把已经修改的狗哥账户余额调整为未转账之前的金额,换句话说,就是要撤销失败事务对当前数据库造成的影响。书面一点的话,我们把这个撤销的过程称之为回滚。当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态。
- 提交的(committed):当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态。
随着事务对应的数据库操作执行到不同阶段,事务的状态也在不断变化,一个基本的状态转换图如下所示:
从图中大家也可以看出了,只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,对于处于中止状态的事务,该事务对数据库所做的所有修改都会被回滚到没执行该事务之前的状态。
3、事务的原理:
- 使用undo log(回滚日志)保证事务的原子性
- 使用redo log(重做日志)保证事务的持久性
- 使用锁机制、MVCC等手段保证事务的隔离性