MVCC 和 undo log

MVCC(多版本并发控制)

Innodb 提供了两个读取操作:锁定读 和 非锁定读(MVCC提供的快照读)
MVCC提供的快照读:依赖底层的 undo log回滚日志

事务日志:undo log回滚日志 redo log重做日志

ACID:ACD(事务日志)+ I(锁+MVCC)

undo log的主要作用:

  1. 事务发生错误时回滚 rollback
  2. 提供MVCC的非锁定读(快照读)

用链表实现,节点里面的 DB_ROLL_PTR 指向上一个历史记录。

已提交读:每一次select,都会产生一次新的数据快照(数据已经被事务正确commit提交过了)

为什么无法解决“不可重复读”?
因为每一次select都会重新产生一次数据快照,其它事务更新后而且已提交的数据,可以实时反馈到当前事务的select结果中。

为什么无法解决“幻读”?
因为每一次select都会重新产生一次数据快照,其它事务增加了和当前事务查询条件相同的新的数据并且以成功commit提交,导致当前事务再次以同样的条件查询时,数据多了。

可重复读:第一次select产生数据快照,而且只产生一次。

为什么解决了“不可重复读”?
第一次select产生数据快照,其它事务虽然修改了罪行的数据,但是当前事务select时,依然查看的是最初的快照数据

快照内容读取原则:
1、版本未提交无法读取生成快照
2、版本已提交,但是在快照创建后提交的,无法读取
3、版本已提交,但是在快照创建前提交的,可以读取
4、当前事务内自己的更新,可以读到

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇