redo log和undo log、事务

本文深入探讨了数据库中redolog和undolog的作用,redolog用于恢复未同步到磁盘的修改,undolog则用于事务回滚和MVCC。同时介绍了事务的隐式提交、保存点、隔离级别实现等内容。

redo log和undo log、事务

redo log

如果系统突然崩溃,一些在缓存中的修改还没来的及同步到磁盘中,用redo log就可以恢复这些修改,Redo log就是记录这些修改的日志。这些对页面的修改有一些是原子操作,比如有些插入伴随着页面分裂和页的新建(悲观插入),此时这些分裂和修改必须一气呵成,这样的操作叫mini-transition,一条语句可能包含多个mini-transition,而一个又包含多个redo日志,这种原子性用一个特殊位来标记,在恢复时读到标志位才恢复之前的内容,否则放弃之前的日志。每次的redo日志也是存到buffer pool中,选择合适的时机刷新到磁盘,可以选择事务提交时同步到磁盘或写入缓存。

(LSN:记录的一个字段,一个redo日志对应的编号,一个页的LSN越大说明刚刚修改过)

undo log

为了事务回滚而记录的日志信息,undo日志有几种类型,插入数据、删除数据、更新数据都会产生不同的undo log,记录有一个roll_pointer的指针指向它的undo log,所有关于这条记录的undo log都连成一条链表,称为版本链,根据undo log的事务ID来判断是哪个事务中修改了该记录,事务回滚时找到对应事务ID的undo log恢复数据除此之外,undo log还可以用来维护MVCC(多版本并发控制)。

(mysql删除时实际上分两步,第一步是标记删除,如果事务提交再将其放入垃圾链表中)

事务

事务的隐式提交:一些DDL语言(create、drop、alter)、使用表的语句(带table的)、开启另一个事务等。。。

创建保存点:savepoint 保存点名

回滚到保存点:rollback to 保存点名

事务的使用:start transaction、commit、rollback

隔离级别的实现

Read uncommitted的实现:每次读时都读最新的那个版本,并发问题最严重

Read committed的实现:避免脏写,在每次读取数据时都生成一个readview,readview其中存有创建当前结构的事务ID,活跃事务ID,然后从记录开始读每个undo log,如果某个undo log刚好是事务的创建ID或不在readview的活跃事务列表中就可以读,这样就避免了脏读。

Repeatable read的实现:在事务第一次读的时候生成readview,然后读记录,这样就能保证读到的数据不可能不一样。

Serializable的实现:依赖mysql的锁

转载于:https://www.cnblogs.com/shizhuoping/p/11562879.html

### 三级标题:Redo Log Undo Log 的基本概念 在 MySQL 数据库中,Redo Log Undo Log事务日志的重要组成部分,它们分别服务于不同的目的。Redo Log 是物理日志,记录了数据页的物理修改,确保事务的持久性数据库的恢复能力。Undo Log 是逻辑日志,记录了事务执行前的数据状态,用于实现事务的回滚多版本并发控制(MVCC)[^3]。 ### 三级标题:Redo Log 的作用 Redo Log 主要用于确保事务的持久性。当事务提交时,Redo Log 会记录所有对数据页的物理修改。即使在系统崩溃后,数据库也可以通过 Redo Log 恢复到崩溃前的状态。Redo Log 具有幂等性,这意味着多次应用相同的 Redo Log 记录不会改变最终状态。例如,插入一行后又删除该行,Redo Log 可以简练地记录这些操作[^2]。 ### 三级标题:Undo Log 的作用 Undo Log 主要用于实现事务的回滚提供多版本并发控制。当事务修改数据时,Undo Log 会记录修改前的数据状态。如果事务需要回滚,数据库可以通过 Undo Log 恢复到事务开始前的状态。此外,Undo Log支持 MVCC,使得多个事务可以并发执行而不会相互干扰。例如,一个事务对表做十万行的记录插入,Undo Log 会记录这些操作的前后状态[^3]。 ### 三级标题:Redo Log Undo Log 的区别 Redo Log Undo Log 在功能实现上有显著的区别。Redo Log 是物理日志,记录的是数据页的物理修改,具有幂等性,适用于崩溃恢复。Undo Log 是逻辑日志,记录的是事务执行前的数据状态,用于事务回滚 MVCC。Redo Log 是存储引擎层产生的,而 Undo Log数据库层产生的。Redo Log事务提交时写入,而 Undo Log事务执行过程中不断记录[^2]。 ### 三级标题:示例代码 以下是一个简单的示例代码,展示了如何在 MySQL 中使用事务并涉及 Redo Log Undo Log: ```sql START TRANSACTION; -- 插入数据 INSERT INTO employees (id, name, position, salary) VALUES (1, 'John Doe', 'Software Engineer', 70000); -- 更新数据 UPDATE employees SET salary = 75000 WHERE id = 1; -- 提交事务 COMMIT; ``` 在这个示例中,Redo Log 会记录插入更新操作的物理修改,而 Undo Log 会记录这些操作前的数据状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值