公众号:架构师与哈苏
关注公众号进入it交流群! 公众号:架构师与哈苏 不定时都会推送一些实用的干货。。。

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。

posted on 2021-08-20 09:16  公众号/架构师与哈苏  阅读(44)  评论(0)    收藏  举报