Mysql事务四大特性
原子性:在一个事务中,所有操作要么一起成功要么一起失败回滚。
隔离性:事务与事务之间应当相互独立互不受干扰。
持久性:事务一旦提交数据将永久保存,数据不能因为机器故障等情况收到变更。
一致性:一致性与原子性息息相关,当数据的状态改变成另一种状态时的数据完整性要求,比如A账号有金额100,A要转帐给B50,B的账号原本50,转账成功后A只有50了,转账失败则A还是100。这系列操作是原子性操作,也遵循了数据一致性要求。
事务的执行流程
事务总体通过buffer pool、Log Buffer、undo log、redo log等机制完成,整体流程如下:
1、数据若存在与buffer pool时,则直接获取缓存池中的数据进行操作,若没有则将数据所在的页整页加载到缓存池中然后进行操作。
2、将旧值存入undo log中。
3、数据操作完毕后更新到buffer pool缓存池中。
4、生成redo log对象存入log buffer中。
5、事务提交后将会把log buffer中的redo log写入redo log文件中,此时redolog的状态为准备阶段。
6、将操作写入binlog文件中。
7、随后将redo log的状态变更为conmit。
事务隔离级别
读未提交读:在事务中会读到其他事务未提交的数据会造成脏读、不可重复读、幻读。
读已提交读:在事务中不会读取到未提交的数据,但还是存在不可重复读、幻读等问题。
读可重复读:在同一个事务中只会生成一个一致性视图,确保在同一个事务中执行同一条查询单条数据的SQL,查询出来数据是一致的,但还是存在幻读。
串行化:事务只能按顺序一个一个执行,不能并发,可解决脏读、不可重复读、幻读等问题,但是效率极低。
什么是MVCC
MVCC 多版本并发控制,主要由一致性视图以及版本链等机制组成,MVCC多版本并发控制机制主要解决并发事务中读写冲突等问题,提高数据库并发读写性能。
一致性视图是在执行select时就会生成,这个一致性视图包含了活跃事务id数组、最小活跃事务、当前事务、下一个事务ID(类似于预分配下一个事务的ID,例如当前事务的ID为1,那么下一个事务的ID就为2)。
版本链:每一条数据都会有两个隐藏的字段,一个是事务id,另一个是数据指针,这个指针指向undo log该数据上一个版本的数据。
读取数据时首先会判断SQL所查询的数据是否存在于Buffer pool中,若不存则直接查询数据库,将目标数据所在页的数据都加载到BufferPool中,然后获取该数据的事务ID若改事务ID小于一致性视图中的最小活跃事务ID,说明这个事务已经被提交了可以返回,若大于等于这个最小活跃事务ID则说明这条数据还没有被提交,就会通过数据指针,在undo log中读取这行数据上一个版本的数据,直到获取的数据事务id小于最小活跃事务ID然后返回。
Mysql 什么是redo log 、undo log、binlog、relay log
redo log:重做日志,存储已提交事务的数据,保证在出现机器故障时对已提交事务数据不丢失从而持久化,Mysql操作数据都是会将数据所在的那一页数据加载到缓存池中的,操作也是操作缓存池中的数据,操作完后不会立即刷新到磁盘,而是会将数据写入redo log中,至于缓存池中的数据时要依靠一个随机IO的线程去将缓存池数据持久化,但在缓存池中数据未持久化这个过程中,机器发生故障,就会导致缓存池数据丢失,所以才引入了read log。
undo log:主要用于事务回滚以及MVCC机制的,当事务需要回滚则会通过查询该数据最新已提交undo log进行回滚。MVCC机制中读可重复读级别在第一次执行会生成一个未提交列表,若查询出来的数据的事务id小于这个未提交列表中最小的事务id则认为当前查询到的数据是已提交的,若发现查询出来的数据所携带的事务id大于或等于未提交列表中的事务id时,则会通过数据指针,从undo log中查询到上一个版本的数据,若发现上一个版本的数据还是不小于未提交列表中的id时,就会再去差undo log,知道查询到已提交的数据。
binlog:以二进制的形式存储客户端操作Mysql的SQL语句以及数据,主要用户增量备份或主从数据同步。
relay log:Mysql 集群中,slave发起同步请求获取到数据后slave并不是直接执行sql,而是会先写入到relay log中,然后读取relay log执行SQL,执行SQL 与直接写入RelayLog两种方式显而易见,优化了数据同步的效率以及数据的持久性。