From ad4e53c93d973c645c3862a7911809be1bac349d Mon Sep 17 00:00:00 2001 From: asahi Date: Tue, 22 Jul 2025 00:36:56 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBmysql=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_事务.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index 67a024a..6c1ed06 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -324,8 +324,27 @@ undo slot主要用于关联undo segment,`当事务启动时,系统会从roll ##### undo segment undo segment为undo slot指向的空间,undo segment中包含多个undo pages,而undo segment中则包含了undo log。 - - +#### undo log格式 +在innodb存储引擎中,undo log分为如下两种类型: +- insert undo log: + - insert undo log是事务在insert操作中产生的undo log + - 在事务提交之前,事务插入的数据对其他事务不可见;而事务提交之后,事务插入的数据对其他读已提交的事务才可见;故而,insert undo log在事务提交之后不再被需要,因为在读已提交隔离级别下,insert undo log是可见的;在可重复读的隔离级别下,insert undo log则是不可见的,没有中间版本,只能可见/不可见 + - 故而,当事务提交之后,即可删除该事务关联的insert undo log +- update undo log + +##### insert undo log +在事务提交之后,insert undo log即可被删除,故而无需purge操作。 + +insert undo log结构如下: +- next:下一个undo log的位置,长度为2字节 +- type_impl: 记录undo的类型,对于insert undo来说,该值为11。该字段长度为1字节 +- undo_no:记录事务的id(压缩后保存) +- table_id: 记录undo log对应的表对象(压缩后保存) +- 记录所有主键的列和值(本次插入的数据,可能多条) +- start:位于undo log尾部,记录undo log的开始位置,长度为2字节 + +> ##### rollback +> 在执行rollback操作时,可以根据insert undo log中存储的table id,主键列、主键值来定位需要回滚的行数据,直接删除回滚数据即可。