Innodb 存储引擎 学习笔记 --事务

本文深入探讨了数据库事务的ACID特性,即原子性、一致性、隔离性和持久性,解释了这些特性如何确保数据的完整性和一致性。文章还详细介绍了重做日志(redolog)和撤销日志(undolog)的作用,以及它们在事务处理中的实现机制。

事务由一组sql语句组成

ACID

原子性:

指整个数据库事务是不可分割的工作单位,要么都做,要么都不做。只有使事务中所有的数据库操作都执行成功,才算整个事务成功/

一致性

指事务将数据库从一种状态转变微下一种一致的状态。

隔离性:

事务提交前对其他事务都不可见,通常使用锁来实现

持久性:

事务一旦提交,其结果就是永久的,即使发生宕机等事故,数据库也能将数据恢复.


事务的隔离性---》由锁来实现

事务的原子性和持久性---》 由 redo log (重做日志) 实现,redo恢复提交事务修改的页操作

事务的一致性--》由undo log 实现,undo回滚到某个特定的版本

 

redo log 基本上只需要写入

undo log 需要进行随机读写

 

事务提交(COMMIT)时,必须将该事务的所有日志文件写入重做日志文件进行持久化

Mysql中还有一种二进制日志(binlog)

Mysql数据库上层的--》bin log是一种逻辑日志,记录的是对应的SQL语句

Innodb存储引擎层的--》redo log是物理格式日志,记录的是对每个页的修改!

 

binlog仅在事务提交时记录,每一个事务只包含一个日志

redolog由于记录的是物理操作日志(对每个页的修改),所以每个事务对应多个日志条目,并且redolog的写是并发的,时间顺序不定

重做日志都是以512字节存储的,这意味着重做日志缓存,重做日志文件都是以块(block)的方式进行保存的,称为重做日志块(redo block)

若一个页中的重做日志数量大于512字节,需要分割为多个重做日志块存储

重做日志文件存储的就是之前在log buffer中保存的log block,因此,它也是根据块的方式进行物理存储的管理。

在Innodb存储引擎运行的过程中,log buffer根据一定的规则将内存中的log block刷新到磁盘,具体规则包括:

1.事务提交时

2.当log buffer中有一半内存空间已经被使用时

3. log checkpoint 时

 

LSN:日志序列号


undo

作用:

1.回滚。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

2.MVCC。当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。

 

事务的回滚需要undo,undo存放在数据库内部的一个特殊段--》undo segment中,undo 段位于共享表空间。

注意:undo是逻辑日志,因此,回滚知识将数据逻辑的恢复到原来的样子,所有的修改都被逻辑的取消了

例如:用户执行了insert 10w条记录的事务---》表空间会增大,但用户执行rollback时,表空间的大小并不会因此缩小!

 

innodb的回滚,它实际上做的是与之前相反的操作:

对于每个insert--->innodb执行一个delete

对于每个delete--->innodb执行一个insert

对于每个update--->innodb执行一个相反的update.

 

注意undo log也会产生 redo log!!

 

其他参考资料:https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html#auto_id_14

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值