悠悠我心的个人网站怎么做,大学生网页设计作业,html5用什么软件,学电子商务后悔死了聊聊undo log
什么是undo log
undo log#xff08;回滚事务#xff09;#xff0c;在事务没有提交前#xff0c;MySQL将记录更新操作的反向操作到undo log日志中#xff0c;以便进行回退保证事务的原子性
undo log的作用
1.提供回滚操作
我们在进行数据更新操作的时候…聊聊undo log
什么是undo log
undo log回滚事务在事务没有提交前MySQL将记录更新操作的反向操作到undo log日志中以便进行回退保证事务的原子性
undo log的作用
1.提供回滚操作
我们在进行数据更新操作的时候不仅会记录redo log还会记录undo log如果因为某些原因导致事务回滚那么这个时候MySQL就要执行回滚rollback操作利用undo log将数据恢复到事务开始之前的状态。
2、提供多版本控制(MVCC)
在InnoDB中MVCC的实现是通过undo log来完成。当用户读取一行记录时若该记录已经被其他事务占用当前事务可以通过undo log读取之前的行版本信息以此实现非锁定读取。
undo的存储结构
1.回滚段和undo页
innodb对undo log采用段的方式进行管理每个回滚段记录1024个undo log segment在每个undo log segment进行undo页的申请
2.回滚段和事务
1.每一个事务只能有一个回滚段一个回滚段可以同时服务于多个事务
2.当事务提交时innodb会做两件事
将undo log放入列表中以供之后的purge操作判断undo log所在的页是否可以重用若可以分配给下个事务使用。
回滚段中的数据分类
1、未提交的回滚数据该回滚数据关联的事务尚未提交要用于实现MVCC所以不能被删除和覆盖
2、已提交但未过期的回滚数据该回滚数据关联的事务已提交但仍然受到undo retention参数的影响继续保留
3、事务已提交并过期的数据该回滚数据属于过期数据当回滚段满之后会被优先覆盖掉。
undo log的类型
在InnoDB中undo log分为两种
insert undo log是指在insert操作中产生的undo log。因为insert操作的记录只对当前事务本身可见对其他事务不可见(这是事务隔离性的要求)因此这种undo log可以在事务提交后直接删除。不需要进行purge操作。undate undo log是对delete和update操作产生的undo log。该undo log可能需要提供MVCC机制使用因此不能在事务提交时就进行删除提交时放入undo log链表等待purge线程进行最后的删除。
详细生成过程
对于InnoDB来说每条记录不仅包括了自身的数据还包含了几个隐藏列
DB_ROW_IDInnoDB为没有主键和唯一索引的表自动添加的隐藏主键DB_TRX_ID更改当前记录的事务idDB_ROLL_PTR回滚指针指向undo log的指针。 新增操作的undo log
start transaction;
insert into user(name) values(Tom);
commit;此时行记录deletemark标记为0表示该记录并未删除回滚指针指向了回滚编号为0的回滚日志回滚日志记录了主键信息说明若要回滚操作可以通过执行delete这个主键实现。
不更新主键的undo log
start transaction;
update user set name Sun where id 1;
commit;此时执行了更新操作并且更新的字段不是主键。此时记录的回滚指针指向了新生成的回滚编号为1的undo log编号为0的undo log连接在编号为1的后面当年记录回滚时也是先通过编号1的undo log恢复到name为Tom再通过编号0的undo log删除记录。 更新主键的undo log
start transaction;
update user set id 2 where id 1;
commit;对于更新主键的操作会先把原来的数据deletemark标识标记为1这时并没有真正的删除数据真正的删除会交给purge清理线程去判断然后在后面插入一条新的记录新的记录也会产生undo log并且undo log的序号会递增。 此时的事务如何回滚
通过undo no3的日志把id2的数据删除通过undo no2的日志把id1的数据的deletemark还原成0通过undo no1的日志把id1的数据的name还原成Tom 通过undo no0的日志把id1的数据删除。
删除操作的undo log
记录的删除操作分为两个阶段:
将记录的deletemark标示位设置为1其他的不做修改(实际会修改记录的trx_idroll_pointer等隐藏列的信息)。当该删除语句所在的事务提交之后undo purge线程来真正的把记录删除掉。就是把记录从正常记录链表移除加入到垃圾连表中。
删除操的undo log只需要考虑对删除操作在阶段1所做的影响进行回滚需要把该记录的trx_id和roll_pointer的隐藏列旧值都记到对应的undo log中的trx_id和roll_pointer属性中。可以通过删除操作的undo log的roll_pointer的属性找到上一次对该记录改动产生的undo log以此来实现回滚。
purage线程的作用
清理undo页和清除page里带有Delete_Bit标识的记录。在InnoDB中事务中的delete操作并不会立刻将数据删除而是先进行Delete Mark标记给记录标识上Delete_bit真正的清除工作是由purge线程在后台完成的