MySql数据库架构与更新流程
2023-12-27 15:04:07 37 举报
MySql数据库架构与更新流程
作者其他创作
大纲/内容
连接
线程
值 + trx_id + roll_pointer
执行SQL
Tomcat
事务A
解析SQL
creator_trx_id
执行计划
ReadView事务A
6、准备提交事务binlog日志写入磁盘
InnoDB存储引擎
undo日志文件
ReadView1、m_ids,此时有哪些事务在执行还没有提交2、min_trx_id,为m_ids里的最小事务id3、max_trx_id,下一个要生成的事务id,也就是最大事务id4、creator_trx_id,当前事务本身id执行事务时,会根据creator_trx_id判断是否在m_ids里的,以及是否小于max_trx_id,再根据undo log版本链里的trx_id进行查找,从而查找到上一个修改版本的数据,进行数据隔离。RC事务隔离,每次事务发起的查询,都重新生成一个ReadView,加上undo log版本链,因此可以读到本事务期间其他事务提交的数据。RR事务隔离,事务发起时生成的ReadView在整个事务提交之前不会发生改变,在根据undo log版本链查找,因此不会读取到这期间其他事务修改过的数据。当多个事务更新同一条数据时,会对这行数据进行加锁,获取锁的事务才能更新这行数据,事务提交后释放锁并唤醒其他正在等待的事务,此时获取锁的事务继续执行更新操作。
最优查询路径
IO线程
事务B
磁盘文件
undo log1、trx_id为事务id,最近一次更新这条数据的事务id,roll_pointer就是指向了更新这个事务之前生成的undo log。2、多个事务并发执行,同一条数据是串行执行的,因此会产生多条undo log,同事多个日志会通过roll_pointer指针串联起来,形成一个版本链。
3、更新内存数据(事务A)
sysbench压测工具top:cup负载和内存dstat:-d 磁盘IO,-r IOPS,-n 网卡流量监控:Prometheus+Grafana(cactifans.hi-www.com)show engine innodb status 查询Buffer Pool情况
redo日志文件
min_trx_id
max_trx_id
2、写入数据的旧值便于回滚
事务B创建锁失败后进入等待队列
m_ids
行锁(独占锁)trx_id=xx等待状态=false
数据库连接池
1、加载数据到缓存
行锁(独占锁)trx_id=xx等待状态=true
ReadView事务B
SQL
Redo Log Buffer
undo log
7、写入binlog文件与位置写入commit标记
undo log(空)
4、写入redo日志
SQL接口
MySQL数据库服务器
脏数据
8、随机刷磁盘
5、准备提交事务redo日志刷入磁盘
SQL解析器
事务A创建锁成功
binlog日志文件
事务B创建锁失败
执行器
查询优化器
Buffer Pool缓冲池
0 条评论
下一页