1.什么是事务
事务: 指作为单个逻辑工作单元(Service方法)执行的一系列操作(数据库操作。),要么完全地执行,要么完全地不执行.
事务可以看做是一组任务,通常对应了一个业务方法,这些任务要么全部成功,要么全部失败。
2.事务的四大特性
事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。
-
原子性 Atomicity :把一组操作(一个事务)看成一个整体,这一组操作要么全部成功,或者全部失败,不可分割
-
Consistency 一致性 :一致性要求任何写到数据库的数据都必须满足于预先定义的规则(数据不能出错),简单来说就是在任何时间点都不能出现违反一致性要求的状态。Mysql通过排他锁来保证一致性
-
Durability 持久性 : 持久性的关键在于一旦“完成提交”(committed),那么数据就不会丢失,因为数据已经被持久化到磁盘。
-
Isolation 隔离性 :多个事务之间是相互隔离的,互不影响,隔离性要求如果两个事务修改同一个数据,则必须按顺序执行,并且前一个事务如果未完成,那么未完成的中间状态对另一个事务不可见。
3.Mysql的原子性是如何实现的
利用Innodb的undo log,undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。 例如
-
当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据
-
当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作
-
当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作
undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。
undo log 除了用作于原子性的保证,mvcc多版本并发控制也是基于undolog的
4.Mysql的持久性是如何实现的
undolog实现事务原子性,redolog实现事务的持久性
Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。
采用redo log的好处?
redo log进行刷盘比对数据页刷盘效率高,具体表现如下
-
redo log体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。
-
mysql的数据页在磁盘上是随机的,而Redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。
redo log它由两部分组成,内存中的 redo log buffer,磁盘上的 redo log file
-
redo log file 由一组文件组成,当写满了会循环覆盖较旧的日志,这意味着不能无限依赖 redo log,更早的数据恢复需要 binlog
-
buffer 和 file 两部分组成意味着,写入了文件才真正安全,同步策略由参数 innodb_flush_log_at_trx_commit 控制
-
0 - 每隔 1s 将日志 write and flush 到磁盘
-
1 - 每次事务提交将日志 write and flush(默认值)
-
2 - 每次事务提交将日志 write,每隔 1s flush 到磁盘,意味着 write 意味着写入操作系统缓存,如果 MySQL 挂了,而操作系统没挂,那么数据不会丢失
-
5.Mysql的InnoDB事务执行原理
比如:要把A=1修改为A=3,事务执行流程如下
1. 事务开始.
2. 记录A=1到undo log.
3. 修改A=3.
4. 记录A=3到redo log.
5. H.将redo log写入磁盘。
6. 事务提交