读未提交
一个事务可以读取到另一个事务未提交的内容,就是脏读
读已提交
读取不到未提交的数据,读的还是原始数据,只有事务提交后了才能读取到
可重复度
在一个事务执行过程中,不管对方事务有没有提交,读取到的数据都是一致的
串行化
事务被排成队,一个个去执行
ACID
隔离性和一致性可以通过事务去实现,但是原子性和持久性是靠undo和redo实现的
undo日志:
为满足原子性,在操作数据之前,会将数据被分到undo Log中,然后再执行修改,如过执行了rollback操作,系统可以将Undo Log数据恢复到事务开始前的状态
undoLog和数据都是先写入内存中,然后再写入磁盘,事务只要提交了,数据肯定会被写入磁盘中,这就是持久性
redo日志
和undo Log相反,redo Log记录的是新数据的备份。在事务提交前,只要将redo Log持久化即可,不需要将数据持久化,减少了磁盘IO读写次数,如果数据库宕机重启后,可以直接从redo中读取数据,数据写入磁盘是在事务提交后异步写入磁盘,实际上数据已经写入到redo log中了
同样是写入,为什么写到redo log就比直接将数据写入磁盘要快呢?
因为有两种写法,一种是随机写入,随机写入时这个空间是随机的所以写入需要转动磁盘寻址,这个很耗费时间。还有一种是顺序写,顺序写是在磁盘中开辟一条连续的空间,这样磁盘就不需要寻址,而redo log就是采用的是顺序写入
为什么mysql数据写入不可以使用顺序写入?
因为mysql的表结构比较复杂,而且还会有索引,而索引是B+树,所以不可以使用顺序写入
undo log在真实情况下其实并非写入磁盘,而是写入redo log中的