尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL 8.0 GDB源码调试MVCC一致性读
在 MySQL 中一致性读也被称为快照读。一致性读是通过 read view undo 版本重建不会加锁也不会阻塞其他事务的读大大提高了并发读取的效率。启动 gdb设置断点跟踪对应的函数MVCC 一致性读主入口只看一致性读 指定表[rootecs-test-node2 ~]# gdb -p 1129464breakrow_search_mvccifprebuilt-select_lock_typeLOCK_NONE$_streq(prebuilt-index-table-name.m_name,summer/emp)(gdb)breakrow_search_mvccifprebuilt-select_lock_typeLOCK_NONE$_streq(prebuilt-index-table-name.m_name,summer/emp)Breakpoint1at 0x4ff9bb8:file/data/mysql-8.0.42/storage/innobase/row/row0sel.cc, line4427.快照建立breaktrx_assign_read_view commands silentprintf [snapshot] trx%p id%lu\n, trx, trx-id bt4continueend(gdb)breaktrx_assign_read_view Breakpoint2at 0x50b91a3:file/data/mysql-8.0.42/storage/innobase/trx/trx0trx.cc, line2320.(gdb)commands Type commandsforbreakpoint(s)2, one per line. End with a line saying justend.\silent\printf [snapshot] trx%p id%lu\n, trx, trx-id\bt4\continue\end可见性判定breaklock_clust_rec_cons_read_sees commands silentprintf [cons-sees] table%s\n, index-table-name.m_namecontinueend Breakpoint3at 0x4e2c620:file/data/mysql-8.0.42/storage/innobase/lock/lock0lock.cc, line242.(gdb)commands Type commandsforbreakpoint(s)3, one per line. End with a line saying justend.silentprintf [cons-sees] table%s\n, index-table-name.m_namecontinueend(gdb)infobreakNum Type Disp Enb Address What1breakpoint keep y 0x0000000004ff9bb8inrow_search_mvcc(unsigned char*, page_cur_mode_t, row_prebuilt_t*, unsigned long, unsigned long)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:4427 stop onlyifprebuilt-select_lock_typeLOCK_NONE$_streq(prebuilt-index-table-name.m_name,summer/emp)2breakpoint keep y 0x00000000050b91a3intrx_assign_read_view(trx_t*)at /data/mysql-8.0.42/storage/innobase/trx/trx0trx.cc:2320 silentprintf [snapshot] trx%p id%lu\n, trx, trx-id bt4continue3breakpoint keep y 0x0000000004e2c620inlock_clust_rec_cons_read_sees(unsigned char const*, dict_index_t*, unsigned long const*, ReadView*)at /data/mysql-8.0.42/storage/innobase/lock/lock0lock.cc:242 silentprintf [cons-sees] table%s\n, index-table-name.m_namecontinueundo 版本重建breakrow0sel.cc:3071# row_sel_build_prev_vers_for_mysqlbreakrow_vers_build_for_consistent_readbreaktrx_undo_prev_version_build(gdb)breakrow0sel.cc:3071 Breakpoint4at 0x4ff6755:file/data/mysql-8.0.42/storage/innobase/row/row0sel.cc, line3076.(gdb)breakrow_vers_build_for_consistent_read Breakpoint5at 0x502334d:file/data/mysql-8.0.42/storage/innobase/row/row0vers.cc, line1254.(gdb)breaktrx_undo_prev_version_build Breakpoint6at 0x5097ae6:file/data/mysql-8.0.42/storage/innobase/trx/trx0rec.cc, line2452.开启测试会话提前开启两个会话一个会话用于一致性读一个用于更新记录。-- 会话1BEGIN;SELECT*FROMempWHEREid1;-- 建立快照命中 trx_assign_read_view-- 会话2BEGIN;UPDATEempSETlocBeijingWHEREid1;-- 提交COMMIT;-- 会话1同一事务再读SELECT*FROMempWHEREid1;-- 可见性判定失败 → 走 undo 重建链MVCC 主要入口函数开启一个事务执行查询。会话1root[summer]begin;Query OK,0rowsaffected(0.00sec)root[summer]select*fromempwhereid1;------------------|id|name|loc|------------------|1|lily|Dalian|------------------1rowinset(0.73sec)[snapshot]trx0x7f116a6d83e8id0#0 trx_assign_read_view (trx0x7f116a6d83e8) at /data/mysql-8.0.42/storage/innobase/trx/trx0trx.cc:2320#1 0x0000000004ffac94 in row_search_mvcc (buf0x7f10e80353e0 \214\002, modePAGE_CUR_GE, prebuilt0x7f10e81b4228, match_mode1, direction0)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:4833#2 0x0000000004d31ab8 in ha_innobase::index_read (this0x7f10e80ffa20, buf0x7f10e80353e0 \214\002, key_ptr0x7f10e8d539b8 \001, key_len4,find_flagHA_READ_KEY_EXACT)at /data/mysql-8.0.42/storage/innobase/handler/ha_innodb.cc:10312#3 0x0000000003a12382 in handler::index_read_map (this0x7f10e80ffa20, buf0x7f10e80353e0 \214\002, key0x7f10e8d539b8 \001, keypart_map1,find_flagHA_READ_KEY_EXACT)at /data/mysql-8.0.42/sql/handler.h:5403[cons-sees]tablesummer/emp会话2执行更新操作。会话2root[summer]BEGIN;Query OK,0rowsaffected(0.00sec)root[summer]UPDATEempSETlocBeijingWHEREid1;Query OK,1rowaffected(0.01sec)Rowsmatched:1Changed:1Warnings:0root[summer]COMMIT;Query OK,0rowsaffected(0.00sec)会话1root[summer]SELECT*FROMempWHEREid1;Thread35connectionhit Breakpoint1, row_search_mvcc(buf0x7f10e80353e0\214\001,modePAGE_CUR_GE,prebuilt0x7f10e81b4228,match_mode1,direction0)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:44274427DBUG_TRACE;(gdb)p prebuilt-trx-id$10(gdb)p *trx-read_view Cannot access memory at address 0x4860ec8348535441(gdb)s AutoDebugTrace::AutoDebugTrace(this0x7f11306f3aa0,function0x73c0388dberr_t row_search_mvcc(byte*, page_cur_mode_t, row_prebuilt_t*, ulint, ulint),filename0x73bead8/data/mysql-8.0.42/storage/innobase/row/row0sel.cc,line4427)at /data/mysql-8.0.42/include/my_dbug.h:122122const char *beginstrchr(function, );(gdb)s123if(begin!nullptr){(gdb)li118class AutoDebugTrace{119public:120AutoDebugTrace(const char *function, const char *filename, int line){121// Remove thereturntype,ifits there. 122 const char *begin strchr(function, );123if(begin!nullptr){124functionbegin 1;125}126127// Cut it off at the first parenthesis;the argument list isundo 版本重建Thread35connectionhit Breakpoint4, row_sel_build_prev_vers_for_mysql(read_view0x7f1164324d20,clust_index0x7f10e8101178,prebuilt0x7f10e81b4228,rec0x7f115526fbe6\200,offsets0x7f11306f31f8,offset_heap0x7f11306f3528,old_vers0x7f11306f2ea8,vrow0x0,mtr0x7f11306f3530,lob_undo0x7f10e81b4440)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:30763076DBUG_TRACE;(gdb)li3071[[nodiscard]]static dberr_t row_sel_build_prev_vers_for_mysql(3072ReadView *read_view, dict_index_t *clust_index, row_prebuilt_t *prebuilt,3073const rec_t *rec, ulint **offsets, mem_heap_t **offset_heap,3074rec_t **old_vers, const dtuple_t **vrow, mtr_t *mtr,3075lob::undo_vers_t *lob_undo){3076DBUG_TRACE;30773078dberr_t err;30793080if(prebuilt-old_vers_heap){(gdb)c Continuing. Thread35connectionhit Breakpoint5, row_vers_build_for_consistent_read(rec0x7f115526fbe6\200,mtr0x7f11306f3530,index0x7f10e8101178,offsets0x7f11306f31f8,view0x7f1164324d20,offset_heap0x7f11306f3528,in_heap0x7f10e8e794a0,old_vers0x7f11306f2ea8,vrow0x0,lob_undo0x7f10e81b4440)at /data/mysql-8.0.42/storage/innobase/row/row0vers.cc:12541254DBUG_TRACE;(gdb)li1249return DB_SUCCESS or DB_MISSING_HISTORY */1250dberr_t row_vers_build_for_consistent_read(1251const rec_t *rec, mtr_t *mtr, dict_index_t *index, ulint **offsets,1252ReadView *view, mem_heap_t **offset_heap, mem_heap_t *in_heap,1253rec_t **old_vers, const dtuple_t **vrow, lob::undo_vers_t *lob_undo){1254DBUG_TRACE;1255const rec_t *version;1256rec_t *prev_version;1257trx_id_t trx_id;1258mem_heap_t *heapnullptr;(gdb)c Continuing. Thread35connectionhit Breakpoint6, trx_undo_prev_version_build(index_rec0x7f115526fbe6\200,index_mtr0x7f11306f3530,rec0x7f115526fbe6\200,index0x7f10e8101178,offsets0x7f11306f3200,heap0x7f10e8f19070,old_vers0x7f11306f2bb8,v_heap0x0,vrow0x0,v_status0,lob_undo0x7f10e81b4440)at /data/mysql-8.0.42/storage/innobase/trx/trx0rec.cc:24522452DBUG_TRACE;(gdb)li2447const rec_t *index_rec ATTRIB_USED_ONLY_IN_DEBUG,2448mtr_t *index_mtr ATTRIB_USED_ONLY_IN_DEBUG, const rec_t *rec,2449const dict_index_t *const index, ulint *offsets, mem_heap_t *heap,2450rec_t **old_vers, mem_heap_t *v_heap, const dtuple_t **vrow, ulint v_status,2451lob::undo_vers_t *lob_undo){2452DBUG_TRACE;24532454trx_undo_rec_t *undo_recnullptr;2455dtuple_t *entry;2456trx_id_t rec_trx_id;(gdb)c Continuing. Thread35connectionhit Breakpoint1, row_search_mvcc(buf0x7f10e80353e0\214\001,modePAGE_CUR_GE,prebuilt0x7f10e81b4228,match_mode1,direction0)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:44274427DBUG_TRACE;(gdb)n4429dict_index_t *indexprebuilt-index;(gdb)n4430bool compdict_table_is_comp(index-table);(gdb)n4431const dtuple_t *search_tupleprebuilt-search_tuple;(gdb)n4432btr_pcur_t *pcurprebuilt-pcur;(gdb)n4433trx_t *trxprebuilt-trx;(gdb)n4439const rec_t *prev_recnullptr;(gdb)n4441const rec_t *prev_rec_debugnullptr;(gdb)n304622unique_searchtrue;(gdb)li4617rows with the same key valueifone of the columns is the SQL4618null. A clustered index under MySQL can never contain null4619columns because we demand that all the columnsinprimary key4620are non-null. */46214622unique_searchtrue;46234624/* Evenifthe condition is unique, MySQL seems to try to4625retrieve also a second rowifa primary key containsmorethan46261column. Return immediatelyifthis is not a HANDLER(gdb)bt#0 row_search_mvcc (buf0x7f10e80353e0 \214\001, modePAGE_CUR_GE, prebuilt0x7f10e81b4228, match_mode1, direction0)at /data/mysql-8.0.42/storage/innobase/row/row0sel.cc:4622#1 0x0000000004d31ab8 in ha_innobase::index_read (this0x7f10e80ffa20, buf0x7f10e80353e0 \214\001, key_ptr0x7f10e8d539b8 \001, key_len4,find_flagHA_READ_KEY_EXACT)at /data/mysql-8.0.42/storage/innobase/handler/ha_innodb.cc:10312#2 0x0000000003a12382 in handler::index_read_map (this0x7f10e80ffa20, buf0x7f10e80353e0 \214\001, key0x7f10e8d539b8 \001, keypart_map1,find_flagHA_READ_KEY_EXACT)at /data/mysql-8.0.42/sql/handler.h:5403#3 0x0000000003a00728 in handler::ha_index_read_map (this0x7f10e80ffa20, buf0x7f10e80353e0 \214\001, key0x7f10e8d539b8 \001, keypart_map1,find_flagHA_READ_KEY_EXACT)at /data/mysql-8.0.42/sql/handler.cc:3239#4 0x00000000035b023a in read_const (table0x7f10e80880c0, ref0x7f10e8d52ec0) at /data/mysql-8.0.42/sql/sql_executor.cc:3675#5 0x00000000035afcff in join_read_const_table (tab0x7f10e8d52de0, pos0x7f10e8d52f98) at /data/mysql-8.0.42/sql/sql_executor.cc:3579#6 0x00000000035f5ed4 in JOIN::extract_func_dependent_tables (this0x7f10e8d526e8) at /data/mysql-8.0.42/sql/sql_optimizer.cc:5837#7 0x00000000035f4a58 in JOIN::make_join_plan (this0x7f10e8d526e8) at /data/mysql-8.0.42/sql/sql_optimizer.cc:5366#8 0x00000000035e77e6 in JOIN::optimize (this0x7f10e8d526e8, finalize_access_pathstrue) at /data/mysql-8.0.42/sql/sql_optimizer.cc:695#9 0x00000000036ae86d in Query_block::optimize (this0x7f10e8f0e078, thd0x7f10e80118e0, finalize_access_pathstrue) at /data/mysql-8.0.42/sql/sql_select.cc:2001#10 0x000000000375c348 in Query_expression::optimize (this0x7f10e8f0df90, thd0x7f10e80118e0, materialize_destination0x0, create_iteratorstrue,finalize_access_pathstrue)at /data/mysql-8.0.42/sql/sql_union.cc:1019#11 0x00000000036ac55e in Sql_cmd_dml::execute_inner (this0x7f10e8d52260, thd0x7f10e80118e0) at /data/mysql-8.0.42/sql/sql_select.cc:999#12 0x00000000036aba23 in Sql_cmd_dml::execute (this0x7f10e8d52260, thd0x7f10e80118e0) at /data/mysql-8.0.42/sql/sql_select.cc:785#13 0x00000000036266d2 in mysql_execute_command (thd0x7f10e80118e0, first_leveltrue) at /data/mysql-8.0.42/sql/sql_parse.cc:4724#14 0x0000000003628aae in dispatch_sql_command (thd0x7f10e80118e0, parser_state0x7f11306f6970) at /data/mysql-8.0.42/sql/sql_parse.cc:5385#15 0x000000000361e683 in dispatch_command (thd0x7f10e80118e0, com_data0x7f11306f7a60, commandCOM_QUERY) at /data/mysql-8.0.42/sql/sql_parse.cc:2055#16 0x000000000361c5ca in do_command (thd0x7f10e80118e0) at /data/mysql-8.0.42/sql/sql_parse.cc:1440#17 0x0000000003844598 in handle_connection (arg0xd0a6bd0) at /data/mysql-8.0.42/sql/conn_handler/connection_handler_per_thread.cc:303--TypeRETformore, q to quit, c tocontinuewithout paging--#18 0x00000000058bf53d in pfs_spawn_thread (arg0xd03ce30) at /data/mysql-8.0.42/storage/perfschema/pfs.cc:3050#19 0x00007f117b3281ca in start_thread () from /lib64/libpthread.so.0#20 0x00007f1179848953 in clone () from /lib64/libc.so.6
RELATED

相关推荐

IDEA 接入智谱 GLM-4.7 及 config.json 配置指南

IDEA 接入智谱 GLM-4.7 及 config.json 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:24:25
Nginx负载均衡配置实战:从原理建模到生产就绪

Nginx负载均衡配置实战:从原理建模到生产就绪

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:24:25
低价32位MCU实战:从Cortex-M0选型到SOP8封装量产避坑

低价32位MCU实战:从Cortex-M0选型到SOP8封装量产避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:24:25
MORE NEWS

更多资讯

📰

JavaWeb在线考试系统:Servlet+JSP+MySQL毕业设计实战与避坑指南

简介:基于JavaWeb的在线模拟考试系统毕业设计文档,面向计算机相关专业毕业生及课程设计学生,针对传统纸质考试流程繁琐、远程组考困难等痛点,给出从需求分析到系统测试的完整解决方案。文档详细讲解了B/S架构下登录注册、在线考试…

📰

为什么量化交易里的Alpha永远无法被全自动代码完全替代?

做了几年量化交易,几乎每周都会遇到有人问我同一个问题:你的策略能不能写成全自动代码,直接挂机跑?问的人多了,我反而开始琢磨这个提问背后的执念——好像只要把“Alpha”写进一段不会睡觉、不会手抖的代码里&#xff…

📰

OpenClaw 搜索能力受限?用 TaoToken 统一 Key 接入 Brave Search API 与 Tavily 的 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

外接硬盘装Ubuntu双系统:物理隔离方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Notepad免安装版制作指南:绿色便携编辑器从选型到自动化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

储能电芯怎么选?形态、材料、参数与验收全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬