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