一:事务四大隔离级别
大家经常用的隔离级别是RC和RR,其中我们的mysql的隔离级别默认是RR的隔离级别
RC隔离:
读已提交的隔离级别,事务必须提交以后才能读出来,但是我们在一个方法里面可能每次读取的数据每次都是不一样的,因为另一个事务提交了数据,所以有不可重复读的问题
RR隔离:
可以重复读数据,意思是我在自己这个事务中,我只要读过一次数据了,以后再怎么读取数据,数据的内容都是之前读取的(快照)数据一样,所以有幻读问题
二:mvcc机制原理
类似:写时复制机制,读写分离
目的:为了读和写高并发的执行,又不需要通过加锁的机制去实现
undo回滚日志,为什么事务没有提交,我们可以实现可以重复读的思想,因为基于undo日志实现的,每条数据都有trx_id,roll_pointer(回滚指针),当我们需要回滚日志的时候,我们会回滚一下数据,回滚指针指向上一条数据,直到事务提交了,我们才会更新数据,这样我们查到的就是提交的数据。
注意:当我们使用可重复读的机制时候,RR隔离机制,我们读到的是之前的(快照)数据,但是我们想更改数据的时候,我们应该加锁(乐观锁,悲观锁)
对于隔离级别的选择:
高并发的话就是用RC这种隔离级别,否则建议使用RR隔离级别,因为RR隔离级别在不同时刻数据有可能被修改,在报表需要大量数据的时候,建议使用RC隔离级别。
三:mysql执行过程
1.首先我们提交了mysql的一条更新数据
2.InnoDB储存引擎
我们在使用innoDB的引擎的时候,mysql的底层还会有一个buffer pool的缓冲池的底层,假设我们更新数据,我们会先更新sql
语句在缓冲池更新数据,但是不会立即刷新到我们的磁盘文件中去,而是会同步的顺序写我们的redo的日志文件中去
注意:我们一般默认写入redo日志就说明我们mysql的消息写成功了,但是我们真实的数据会通过IO线程通过异步的方式不经意的(随机)写入磁盘中去