Mysql性能优化第三课(1)
2022-03-17 16:28:40 0 举报
Mysql InnoDB的存储引擎、间隙锁、Gap锁、MVCC等
作者其他创作
大纲/内容
1000
UNDO_NO:3
...
prev record offset
1
account(账户表)
2. 判断trx_id(1) <min_trx_id(13),满足条件,直接读取
ReadView
begin;
可能
trx_id
roll_pointer
name
主键列信息
balance
id
李四
地址偏移量
800
上一个版本地址
delete_mask
2. 修改Buffer Pool中的数据
next record offset
merchant.idb
row_id
undo_log
1. 执行业务逻辑
3. 写入UNDO_LOG
TABLE_ID:12331
update
commit;
trx_id=3
隐藏列
banalce
UNDO Log工作原理
UNDO_TYPE:TRX_UNDO_UPD_EXIST_REC
RR级别: 直接沿用原来的ReadView
1200
生成ReadView事务的事务id
UNDO_LOG
3.2 Rollback
查询结果
trx_id=2
修改后的数据(未持久化idb文件)
select * from user where id=1;
回滚数据
事务1
回滚指针
old roll_pointer
这个时候开启一个新的事务,那么trx_id=15
info
old trx_id: 3
1002
3.1 Commit
Commit
merchant(商户表)
select * from user where id>=1
不可能
持久化到磁盘
此时返回的结果: name='李四'
插入一条记录
UNDO_TYPE:TRX_UNDO_INSERT_REC
1001
begin; update account set balance=balance-200 where id=1; update merchant set amount=amount+200 where id=1001;commit/rollback;
系统当前有两个正在运行的事务,事务id分别是13,14
张三
事务2
活跃事务id列表
Transaction 2
幻读
rollback;
Redo 日志
User
UNDO_TYPE:TRX_UNDO_DEL_MARK_REC
事务A
此时:trx_id=15
2
next_record
原始数据
undo_type
此时:trx_id=1
200
undolog
王五
amount
上述数据行按照下面的方式来执行
指向UNDO_LOG
trx_id=5
在 RC 隔离级别下多次读取,看不到别的事务未提交的更新,可避免脏读的问题。
4. 写入UNDO_LOG
0
select * from user where id=1
3. 记录Redo Log到Log Buffer
指向回滚日志
关注公众号: 跟着Mic学架构
多个事务执行时,UNDO_LOG形成版本链
记录头信息
REDO Log 工作原理
m_ids
begin;
2. 提交事务
对InnoDB不可能
指针指向历史undo_log
select * from user;
Transaction 1
此时返回的结果: name='李二'
系统分配给下一个事务的事务id
查询的结果
name=李四
old trx_id: 2
1. 事务提交时,第一步先把Log Buffer持久化到redo log 文件2. 然后再修改Buffer Pool中的数据
查询的数据结果
RC级别,生成新的ReadView
可重复读(Repeatable Read)
指向Undo_Log
Undo Buffer
事务B
执行更新操作,记录UNDO日志
update set name='李二' where id=1001
插入一条数据
UNDO_NO:2
数据行事务id的变化
min_trx_id
系统活跃读写事务中的最小事务id
事务3
多事务竞争时产生的脏读问题
update user set balance=800 where id=1
Buffer Pool
RR模式
串行化(Serializable)
磁盘
在事务1提交之前,对方向你丢来一个delete语句
持久化文件
MVVC实现的基础-UNDO版本链
creator_trx_id
UNDO_NO:1
2002
已提交读(Read Committed)
UNDO日志
1. update user set password=111111 where id=1;
脏读
在 RR 隔离级别下多次读取,看不到别的事务未提交的更新,可避免脏读的问题。
所以,此时返回的结果: name='李四'
触发数据回滚
1. update account set balance=1000 where id=1;2. update merchant set amount=1000 where id=1001;
rollback
持久化到undo文件
读已提交产生的不可重复读
指向历史undo_log
update user set id=2002 where id=1001
update操作触发undo日志
该事务未提交,事务id不变
基于UNDO Log实现数据回滚
生成反向操作SQL
事务隔离级别
old trx_id: 15
持久化数据到ibd文件
未提交读(Read Uncommitted)
向表中insert一条语句时,UNDOLOG的状态
MVVC如何解决RC和RR的隔离性问题
把Log Buffer持久化到磁盘文件
Log Buffer
max_trx_id
存储修改前的数据快照
begin; update account set balance=balance-200 where id=1; update merchant set amount=amount+200 where id=1001;
2. select * from user where id=1;
1. 判断trx_id(15) 等于max_trx_id(15),所以记录行上的数据对本事务不可见。2. 从版本链中找上一个版本,判断trx_id(1) < min_trx_id(13),于是返回该版本数据
account.idb
系统下一个要分配的事务ID是:15
1. 判断当前记录中trx_id(1) 与 creator_trx_id(0) 是否相等,
执行Update操作并且是更新主键时
加载数据到Buffer Pool
李二
不可重复读
old trx_id: 1
User.ibd
指向undo_log的指针
收藏
收藏
0 条评论
下一页