在数据库中,我们将我们的指定的一些操作设置为一个事务。
事务的四大特性ACID
- Atomocity:原子性,一个事务中的所有操作,要么全部完成,要么全部失败。
- Consistency:一致性,一个或多个事务执行后,原来一致的数据和数据库仍然是一致的。银行转账前后,金额的总额不改变。
- Lsolation:隔离性,数据库开启一个事务时,不会受到其他事务对数据操纵导致数据不一致。多个事务并发互不影响。
- Durability:持久性,事务提交后,对数据库中的数据的修改是永久的。它无法通过回滚或者任何方式来进行恢复。
而事务的ACID是通过
InnoDB日志
和锁
来保证。
- 事务的隔离性是通过
数据库锁+MVVC
的机制实现的。- 事务的持久性通过
redo log(重做日志)
来实现。- 原子性和一致性通过
Undo log(回撤日志)
来实现.
Undo Log保存了事务发生之前的数据的一个版本,为了满足事务的原子性,在事务前备份数据到Undo Log,然后进行数据的修改。如果出现了错误或者用户执行了roll back语句,系统可以利用Undo Log的数据进行恢复。
Redo log确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
事务的隔离级别
MySql5.5后使用的是InnoDB
引擎,它默认隔离级别是可重复读的
。
Orcale默认隔离级别是读已提交
。
MySQL数据库共定义了四种隔离级别:
- Serializable(串行化):可避免脏读、不可重复读、幻像读取情况的发生。
- Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。
- Read committed(读已提交):可避免脏读情况发生。
- Read uncommitted(读未提交):最低级别,以上情况均无法保证。
脏读:事务T1对数据进行修改,但未提交;事务T2进行数据读取,读取到修改但未提交的数据;事务T1进行回滚,取消了数据的修改,事务T2之前读取的数据为无效数据。
不可重复