事务和事务的特性
事务特性
acid,automicity,consistency,isolation,durability
原子性,一致性,隔离性,持续性
原子性 - 事务只能全部成功或者全部失败,不能部分成功,也就是0或者1
一致性 - 数据库在修改前和修改后,数据库的完整性不会破坏
隔离性 - 四种隔离级别
持续性 - 数据库的数据是永久保存在系统磁盘中的,不会因为系统故障而丢失
事务执行流程
Server:解析sql语句 - sql优化器 - 执行sql语句
innoDb:意向锁,内存(undolog的redolog记录,所修改数据的undolog,所修改数据的redolog —脏页形成),磁盘(redolog落盘事务提交),checkpoint,解意向锁,事务成功。
注意:此时脏页和undolog都没落盘,所以数据仍然存在于内存中
checkpoint:是否落盘 - undolog和脏页落盘
隔离级别以及分别的缺点
所有隔离级别的讨论都是基于两个会话,一个会话用于读,另一个会话删改。两个会话都是增删改一定是?
未提交读
定义:事务未提交就已经可以被其他读的会话所访问
脏读:读取到未提交的数据
已提交读
可重复读
定义:会话无论读几次,都按照第一次得到的数据(readview)来进行读(这就是说无论另一个会话怎么删改?都不影响读的这个会话的数据,读的数据都是第一次原始得到的)
幻读:非等值查询的时候,当查询次数超过两次以后,会查询到其他增删事务的后所形成的数据问题
串行读
定义:读的时候被读的数据会被上锁,只有读完了以后才可以操作。
LBCC
LBCC是用当前读的方式来对操作上共享锁和排他锁实现串行级别的隔离机制。
MVCC - 两种隔离级别(重复读,已提交读)
readview
定义:readview是一个存活的事务id列表,它的结构是:事务id,回滚指针,数据内容;回滚指针会指向旧的事务,事务id是递增的,新的事务的id会比旧事务id大
它有三种属性:最大值,最小值,当前事务id?
最大值是预留的将要生成的下一个事务id
最小值是存活的最小事务id(事务列表中id最小值)
当前事务id, 不存在于readview中.
读取数据在读之前会执行一次readview,多次查询,每一次都获取readview是已提交读,只有第一次获取readview,后面的查询都依照第一次的readview是重复读
undolog
事务版本链,是一个链表结构,它的结构是:事务id,回滚指针,数据内容,回滚指针会指向旧的事务,事务id是递增的,新的事务的id会比旧事务id大
当前读和快照读
快照读:就是简单查询,不上锁。
当前读:上了锁的读操作,通常会搭配一些删改操作,所有以下命令都属于当前读。
除了第一条是共享锁以外,其他都是排他锁。
lock in share mode
select for update
insert
update
delete