mysql的隔离级别从高到低分别为: 串行化->可重复读->读已提交->读未提交
Serialzable(串行化):可避免脏读,不可重复读,幻读的发生。
Repeatable read(可重复度): 可避免脏读,不可重复读的发生。
read committed (读已提交): 可避免脏读的发生。
read uncommitted (读未提交): 最低级别,如何情况都无法保证。脏读。
隔离级别对照表
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read UnCommitted | 可能 | 可能 | 可能 |
Read Committed | 不可能 | 可能 | 可能 |
Repeat Read | 不可能 | 不可能 | 可能(Mysql InnoDB不可能,MVCC了解一下) |
串行化 | 不可能 | 不可能 | 不可能 |
MVCC
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
MVCC好处
多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始的数据库的快照。
MVCC原理
MVCC的目的就是多版本并发控制,在数据库中实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的3个隐式字段,undo日志,Read View来实现的。
3个隐式字段
每行记录除了我们自定义的字段外,还有数据库隐式定义
- DB_TRX_ID 6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID
- DB_ROLL_PTR 7byte,回滚指针,指向这条记录上一个版本(存储于rollback segment里)
- DB_ROW_ID 6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引。
- 实际还有一个删除flag隐藏字段,即记录被更新或者删除并不代表真的删除,而是删除flag 变了
undo日志
undo log主要分为两种:
- insert undo log
- 代表事务在insert新记录时产生的undo log,只在事务回滚时需要,并且在事务提交后可以被立即丢弃。
- update undo log
- 事务在进行update或delete时产生的undo log;不仅在事务回滚时需要,在快照读时也需要,所有不能随便删除,只有快速读或事务回购不涉及该日志时,对应的日志才会被purge线程统一清除。
什么是Read View?
说白了Read View就是事务进行快照读操作的生产的读视图(Read View), 在该事务执行的快照读的那一刻,会生产数据库系统当期的一个快照,记录并维护系统当期活跃事务的ID(当每个事务开启时,都会被分配一个ID,这个ID是递增的,所以最新的事务,ID值越大)
RC(读已提交)和RR(可重复读)快照读有什么不同?
RC隔离级别下,是每个快照读都会生成并获取最新的Read View;
RR隔离级别下,同一个事务中的第一个快照读才会创建Read View,之后的快照读获取的都是同样一个Read View。