当前位置: 首页 > news >正文

事务实现的底层原理

1.Undo Log(回滚日志)

  • 作用:
  • Undo Log 主要用于事务回滚和 MVCC(多版本并发控制)。
  • 在 MVCC 中,Undo Log 提供了数据的历史版本,保证了事务读取数据时的一致性。
  • 它记录了数据修改前的状态,当事务执行失败或者需要回滚时,可以使用 Undo Log 将数据恢复到事务开始之前的状态。
  • 存储:
  • Undo Log 通常存储在单独的日志文件中。
  • 每个事务执行的修改操作都会被记录到 Undo Log。
  • 原理:
  • 当事务对数据进行修改时,会先将修改前的数据写入 Undo Log,然后再执行修改操作。
  • 如果事务回滚,则数据库可以使用 Undo Log 中记录的操作的反向操作,将数据恢复到事务开始之前的状态。
  • 如果事务提交,则 Undo Log 可以被删除或重用。

2. Redo Log(重做日志):

  • 作用:
  • Redo Log 主要用于保证事务的持久性。
  • 即使数据库发生崩溃,也可以通过 Redo Log 将未持久化的数据恢复。
  • 当事务提交时,会先将事务的修改记录写入 Redo Log,然后再异步写入磁盘。
  • 存储:
  • Redo Log 通常存储在单独的循环写入的日志文件中,固定大小。
  • 原理:
  • 当事务对数据进行修改时,会先将修改操作写入 Redo Log,然后才修改内存中的数据页。
  • 如果系统崩溃了,会在重启的时候,回放 Redo log,恢复数据。
  • 当数据页被刷新到磁盘时,Redo Log 中对应的记录会被标记为已完成。
  • Redo Log 采用了预写日志(Write Ahead Logging)技术,保证了事务的持久性。

 3.锁机制

  • 作用:
  • 锁机制用于控制并发事务之间对数据的访问,保证事务的隔离性。
  • 不同的锁类型,例如行锁、表锁、共享锁、排他锁等,用于实现不同的并发控制策略。
  • 实现:
  • 当事务需要读取或修改数据时,会先尝试获取相应的锁。
  • 当事务执行完成后,会释放持有的锁。
  • 如果锁被其他事务占用,则当前事务需要等待。

4.MVCC(多版本并发控制):

  • 作用:
  • MVCC 用于提高并发事务的性能,避免使用过多的锁。
  • MVCC 通过维护数据的多版本,使得不同的事务可以读取到不同版本的数据。
  • 实现:
  • 每个事务启动时,会创建一个 Read View,用来记录当前事务启动时,其他活跃事务的信息。
  • 事务读取数据时,会根据自身的 Read View 和数据的版本信息来判断是否可以看到该版本的数据。

5.事务管理器:

  • 作用:
  • 事务管理器负责协调事务的执行、提交和回滚。
  • 它会记录事务的状态,并且会保证事务的ACID特性。
  • 实现:
  • 通过对 undo log 和 redo log 进行操作,完成事务的回滚和提交操作

 6.总结:

  • 事务的底层原理涉及 Undo Log、Redo Log、锁机制、MVCC 和事务管理器等多个关键组件。
  • Undo Log 用于事务回滚和 MVCC,Redo Log 用于保证事务的持久性,锁机制用于控制并发访问,MVCC 用于提高并发性能。
  • 这些机制共同作用,保证了事务的 ACID 特性,确保数据库的可靠性和数据的一致性。
http://www.dtcms.com/a/303390.html

相关文章:

  • SwinTransformer改进(14):集成MLCA注意力机制的Swin Transformer模型
  • 机器学习基础-numpy
  • 【JavaScript】const 定义的对象禁止修改内部属性
  • USRP X410 X440 5G及未来通信技术的非地面网络(NTN)
  • Windows10镜像下载
  • 策略路由—PBR
  • laravel chunkById导出数据乱序问题
  • 软件工程:阿里巴巴Java编程手册
  • CCCS作为主要起草人参与《信息技术 智能语音交互系统 第3部分:智能客服》国家标准修订
  • 阿里云 【免费试用】MCP 赋能可视化 OLAP 智能体应用
  • 『 C++ 入门到放弃 』- 哈希表
  • 微积分 | dx / dy 不是比率吗?
  • 《C++继承详解:从入门到理解公有、私有与保护继承》
  • ffmpeg-7.1.1 下载安装 windows 版,MP4 转 m3u8 切片,遇到报错 Unrecognized option ‘vbsf‘的解决办法
  • Linux:理解操作系统
  • 数据结构(动态数组)
  • PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
  • DevOps时代的知识治理革命:Wiki如何成为研发效能的新引擎
  • GPT Agent与Comet AI Aent浏览器对比横评
  • Anaconda创建环境报错:CondaHTTPEFTOT: HTTP 403 FORBIDDEN for url
  • 力扣 之 最小覆盖子串(变长滑动窗口,越短越好)
  • 推客系统全链路架构设计与高并发实践:从CPS分佣到社交裂变
  • ARM双频RFID读写系统的设计
  • 【快捷指令】ios/macos快捷指令如何调用api接口(json请求例子)
  • 从“数字鸿沟”到“数字红利”:智慧养老如何让老人跨越技术门槛
  • MBR和GPT分区的区别
  • C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;
  • 导入Maven项目
  • 解决幻读问题
  • maven 打包报错 process terminated