您的当前位置:首页 >IT科技类资讯 >MySQL 核心模块揭秘 | 事务提交了,Undo 日志怎么办? 正文
时间:2025-11-04 21:06:30 来源:网络整理编辑:IT科技类资讯
目录1. 修改 Insert Undo 段状态2. 生成事务提交号3. 回滚段加入 purge 队列4. 处理 Update Undo 段4.1 Undo 段状态4.2 Undo 日志页数量4.3 U
目录1. 修改 Insert Undo 段状态2. 生成事务提交号3. 回滚段加入 purge 队列4. 处理 Update Undo 段
4.1 Undo 段状态

4.2 Undo 日志页数量
4.3 Undo 日志组
4.4 Undo 段链表
5. 清理 Insert Undo 段6. 总结事务提交过程中,心模首先要处理的块揭 Undo 相关逻辑,就是秘事修改 Insert Undo 段的状态:
如果事务分配了用户普通表 Insert Undo 段,修改该 Undo 段的志办状态。如果事务分配了用户临时表 Insert Undo 段,心模修改该 Undo 段的块揭状态。根据 Insert Undo 段是秘事否能直接被复用,Insert Undo 段的志办状态会被修改为 TRX_UNDO_CACHED 或者 TRX_UNDO_TO_FREE。
如果 Insert Undo 段只管理了一个 Undo 页,心模并且该 Undo 页已使用空间小于四分之三,块揭Undo 段的秘事状态被修改为 TRX_UNDO_CACHED,表示 Undo 段可以缓存起来直接复用。志办否则,心模Undo 段的块揭状态被修改为 TRX_UNDO_TO_FREE,表示 Undo 段以及它管理的秘事 Undo 页需要被释放。
如果事务分配了用户普通表 Update Undo 段,或者用户临时表 Update Undo 段,事务提交过程中,需要生成事务提交号。事务提交完成之后,purge 线程会根据这个事务提交号,决定什么时候清理该 Update Undo 段管理的 Undo 页中的 Undo 日志。b2b供应网
和事务 ID 一样,事务提交号也来源于事务子系统(trx_sys)的 next_trx_id_or_no 属性。
事务启动时,直接获取 trx_sys->next_trx_id_or_no 属性的值,作为事务 ID,然后该属性值加 1。事务提交时,直接获取 trx_sys->next_trx_id_or_no 属性的值,作为事务提交号,然后该属性值加 1。这意味着事务 ID 和事务提交号由同一个流水线生产,同一个事务的提交号总是大于事务 ID。
生成的事务提交号会保存到事务对象(trx)的 no 属性中。
生成事务提交号之后,当前正在提交的事务对象(trx)会加入事务子系统(trx_sys)的 serialisation_list 链表的末尾。这个链表中的所有事务,都是正在提交的事务。更严格的来说,这些事务都是源码库已经生成了事务提交号,但是还没有提交完成的事务。
如果事务分配了 Update Undo 段,该 Undo 段所属的回滚段需要加入到 purge 队列中,表示该回滚段下有需要 purge 线程清理的 Undo 日志。
如前所述,回滚段会按需加入 purge 队列:
如果用户普通表回滚段下分配了 Update Undo 段,并且该回滚段目前不在 purge 队列中,则加入 purge 队列。如果用户临时表回滚段下分配了 Update Undo 段,并且该回滚段目前不在 purge 队列中,则加入 purge 队列。InnoDB 给同一个事务分配的的用户普通表回滚段和用户临时表回滚段,如果都需要加入 purge 队列,不能各自为战,而是打包加入。
这个包怎么打?
InnoDB 会创建一个 TrxUndoRsegs 对象,这个对象有个 m_rsegs 属性,是个数组。
如果用户普通表回滚段需要加入 purge 队列,先加入到 m_rsegs 数组中。
如果用户临时表回滚段需要加入 purge 队列,也加入到 m_rsegs 数组中。
然后,事务对象(trx)的站群服务器 no 属性中保存的事务提交号,也保存一份到 TrxUndoRsegs 对象的 m_trx_no 属性中。
打完包之后,TrxUndoRsegs 对象会被加入 purge 队列。
为了逻辑统一,如果事务只分配了用户普通表回滚段、用户临时表回滚段两者之一,回滚段也会打包成 TrxUndoRsegs 再加入 purge 队列。
用户普通表 Update Undo 段和用户临时表 Update Undo 段的处理逻辑一样。下面以用户普通表 Update Undo 段为例,介绍事务提交过程中 Update Undo 段需要进行的操作。
如果事务分配了用户普通表 Update Undo 段,现在需要修改它的状态了。和 Insert Undo 段一样,满足条件的 Update Undo 段也可以被缓存起来直接复用。
如果 Update Undo 段只管理了一个 Undo 页,并且该 Undo 页已使用空间小于四分之三,这个 Update Undo 段可以被缓存起来直接复用,它的状态会被修改为 TRX_UNDO_CACHED。否则该 Undo 段不能被复用,它的状态会被修改为 TRX_UNDO_TO_PURGE,表示等待 purge 线程清理 Update Undo 段管理的 Undo 页中的 Undo 日志。
对于状态为 TRX_UNDO_TO_PURGE 的 Update Undo 段,回滚段首页中保存着该 Undo 段首页的页号的小格子(Undo Slot)的值会被修改为 4294967295(代码里为 FIL_NULL),也就解除了回滚段和该 Undo 段的关系。
Update Undo 段管理的 Undo 页的数量,会累加到回滚段头信息的 TRX_RSEG_HISTORY_SIZE 属性中,这个属性表示回滚段的 history 链表中所有 Undo 日志组占用的不会再写入 Undo 日志的 Undo 页的数量之和。
本小节介绍的内容,状态为 TRX_UNDO_CACHED 和 TRX_UNDO_TO_PURGE 的 Update Undo 段都需要操作。
当前 Update Undo 段中,正在提交的事务产生的 Undo 日志所在的 Undo 日志组,会加入回滚段的 history 链表的头部,等待 purge 线程清理其中的 Undo 日志。
给事务子系统(trx_sys)的 rseg_history_len 属性值加 1,表示回滚段的 history 链表中等待 purge 线程清理 Undo 日志的 Undo 日志组又增加了一组。
代码里实现的 rseg_history_len 加 1 的过程有一点点复杂,这里描述的是结果,也就是 Update Undo 段中一个 Undo 日志组加入了 history 链表,rseg_history_len 就会加 1。
rseg_history_len 加 1 之后,还会判断相加的结果是否大于阈值。如果大于,意味着回滚段的 history 链表中等待清理的 Undo 日志组有点多。此时,如果 purge 线程处于休眠状态,会唤醒 purge 线程开始清理 Undo 日志。
接着还要把事务对象(trx)的 no 属性中保存的事务提交号,写入回滚段头信息的 TRX_RSEG_MAX_TRX_NO 属性中、Undo 日志组头信息的 TRX_UNDO_TRX_NO 属性中。
如果这个 Undo 日志组中既不包含 Delete 或者 Update 操作标记删除记录产生的 Undo 日志,也不包含修改溢出字段产生的 Undo 日志,还会把 Undo 日志组头信息的 TRX_UNDO_DEL_MARKS 属性值修改为 false,purge 线程清理 Undo 日志过程中读取到这组 Undo 日志时,就知道不需要执行物理删除表中记录的操作。
如果管理当前 Update Undo 段的回滚段不在 purge 队列中,会加入 purge 队列。否则,不需要重复加入。purge 线程清理完回滚段的 history 链表中一个 Undo 日志组的所有 Undo 日志之后,接下来就会清理下一组。
回滚段的 history 链表中,Undo 日志组按照自己头信息的 TRX_UNDO_TRX_NO 属性中保存的事务提交号,由小到大串连起来。事务提交号最小的 Undo 日志组在 history 链表末尾,事务提交号最大的 Undo 日志组在 history 链表头部。
purge 线程清理时,先清理事务提交号小的 Undo 日志组中的 Undo 日志,再清理事务提交号大的 Undo 日志组中的 Undo 日志。
前面那些操作完成之后,就进入收尾阶段了。Update Undo 段会从回滚段的 update_undo_list 链表中移除。
如果 Update Undo 段的状态为 TRX_UNDO_CACHED,还会加入回滚段的 update_undo_cached 链表头部,等待复用。
如果 Update Undo 段的状态为 TRX_UNDO_TO_PURGE,则释放它的内存对象。Undo 表空间中该 Undo 段及它管理的 Undo 页都不会释放,需要等到 purge 线程清理完 Undo 日志之后才能释放。
前面已经确定了 Insert Undo 段的状态,现在是时候根据状态处理 Insert Undo 段了。
首先,从回滚段的 insert_undo_list 链表中删除 Insert Undo 段。
然后,如果 Insert Undo 段的状态为 TRX_UNDO_CACHED,把它加入到回滚段的 insert_undo_cached 链表头部。
如果 Insert Undo 段的状态为 TRX_UNDO_TO_FREE,先释放 Undo 表空间中该 Insert Undo 段及它管理的 Undo 页,再释放 Undo 段的内存对象。
事务提交过程中,Undo 相关的流程如下:
修改 Insert Undo 段的状态为 TRX_UNDO_CACHED 或者 TRX_UNDO_TO_FREE。生成事务提交号。把管理 Update Undo 段的回滚段加入到 purge 队列中。从回滚段的 update_undo_list 链表中移除 Update Undo 段。可以被缓存的 Update Undo 段,还需要加入 update_undo_cached 链表。从回滚段 insert_undo_list 链表中移除 Insert Undo 段。可以被缓存的 Insert Undo 段,还需要加入 insert_undo_cached 链表。《牧场物语电脑操作教程——让你成为农场达人》(从零基础到游戏高手,掌握关键技巧!)2025-11-04 20:59
windows 7经常性的休眠后自动重启的问题如何解决2025-11-04 20:51
windows 7怎么切换用户? windows 7系统切换用户的方法2025-11-04 20:27
windows 7下单方面修改桌面图标的方法(图文教程)2025-11-04 20:09
宏基E5-532G-C98P的性能与优势(一款高性能、全能的笔记本电脑)2025-11-04 19:57
windows 7计算机右键属性打不开窗口的解决方法2025-11-04 19:43
如何使用windows 7+IE9一键锁定你所喜欢的网站2025-11-04 19:36
创建一个Windows7标准用户帐户的方法(图文教程)2025-11-04 19:00
解决电脑Java平台错误的有效方法(探索如何应对和修复常见的电脑Java平台错误)2025-11-04 18:54
windows 7WIFI共享精灵打不开的具体解决步骤2025-11-04 18:27
宏基E5-532G-C98P的性能与优势(一款高性能、全能的笔记本电脑)2025-11-04 20:52
windows 7系统开启系统保护时候提示错误:0x8007007B的解决方法2025-11-04 20:33
让windows 7系统开机自动连接ADSL 让电脑开机自动ADSL拨号的方法2025-11-04 20:22
windows 7中安装IIS服务器的步骤分享2025-11-04 20:12
HTCOneMax拍照表现如何?(探索HTCOneMax相机的功能与性能)2025-11-04 20:09
windows 7系统中登陆界面如何设置提示语 最炫系统登陆界面设置图2025-11-04 19:55
windows 7系统下使用print screen键加画图工具实现屏幕截图2025-11-04 19:49
windows 7个性化桌面背景如何设置具体该怎么操作2025-11-04 19:47
手机插U盘使用教程(快速实现手机和U盘的数据传输,让移动存储更便捷)2025-11-04 19:44
window7系统怎么使用快捷键(Ctrl+shift+?)新建文件夹2025-11-04 19:38