Java开发 - 数据库中的基本数据结构(三)

简介: Java开发 - 数据库中的基本数据结构

隐藏字段作用


下面,我们通过下面的表来表示三个隐藏字段工作的原理:


用户表user,事务A执行插入张三数据之后:

id name age db_trx_id db_roll_ptr
1 张三 20 1 null(刚插入,无回滚地址)

用户表user,事务B执行修改张三年龄数据之后:

id name age db_trx_id db_roll_ptr
1 张三 30 2 0x10010001(假设这是张三之前的地址)

undolog:

事务A执行之后undolog内产生一条新纪录

id name age db_trx_id db_roll_ptr
1 张三 20 1 null

事务B执行之后undolog内产生一条新纪录

id name age db_trx_id db_roll_ptr
1 张三 30 2 0x10010001

如果还有其他的事务操作这条数据,以此类推即可。


ReadView


在事务执行的时候,就会生成当前事务的ReadView,用于保存当前事务之前活跃的所有事务id,之前活跃的事务的最小id,当前事务结束后即将分配的下一个id,创建ReadView的当前事务id,名字分别如下:


m_ids: 截止到当前事务id之前,所有的活跃事务id

min_trx_id: 记录以上活跃事务id中的最小id值

max_trx_id: 保存当前事务结束后应分配的下一个id值

creator_trx_id: 保存创建ReadView的当前事务的id

我们用几张表来表示下三者结合的工作过程:


给出一个事务操作后形成的用户表:


事务1插入张三


事务2插入李四

id name age db_trx_id db_roll_ptr
1 张三 20 1 null
2 李四 25 2 null

模拟并发事务的工作过程:

时刻 事务A   id:8 事务B   id:9
t1 begin
t2 beigin
t3 查询张三的年龄为20
t4 修改张三的年龄为30

t5

commit
t6

再次查询张三的age,MVCC下应为20

t7 commit

事务AB工作时会分别生成自己的ReadView:

  事务A的ReadView:

m_ids

min_trx_id max_trx_id creator_trx_id
假设为3,4,5,6 3 9(下一个应分配事务id) 8(当前事务id)

所有的select不加锁,所以都是执行的快照读,所以后面的事务可以从undolog中读取到之前的事务执行的状态,所以在做查询时必须参考之前的快照。


现在开始分析事务8和9每个时刻的操作。


在t3时刻,查询张三的年龄时:


先去看这条数据是否在m_ids中,若果在,则处于活跃状态,说明这条数据还没提交,则不能访问,若不在,说明在当前事务之前已经提交,则可以访问,接着去查找创建这条数据的事务id是否小于当前事务id,如果小于,那一定是在当前事务之前已经执行完的事务,就可以读取到这条数据,否则,还未执行,不可访问。


上面这段话比较绕,但说的比较详细,如果理解的话,那么事务9的执行过程就很清晰了。


在t4时刻,修改用户表的年龄为30:


undolog产生第一条快照数据

id name age db_trx_id db_roll_ptr
1 张三 20 1 null

事务9执行修改操作之后,用户表应为:

id name age db_trx_id db_roll_ptr
1 张三 30 9 0x10010001
2 李四 25 2 null


张三产生回滚地址,当前事务id变化。


t5时刻提交:


事务9生效。


t6时刻再次查询张三的age:


此时拿最后一次执行的事务id-9去ReadView中去m_ids里找,找得到说明时活跃的,没有提交,活跃时不可访问,如果和creator_trx_id比较,相等,说明是自己的操作,可以访问,否则无法访问。如果不在m_ids,说明不再活跃,已提交,不再和当前创建事务id做比较,去和max_trx_id对比,如果db_trx_id大于等于max_trx_id,说明查询的数据在当前事务之后发生改变,无法访问,此时需要通过undolog快照去查找db_trx_id为当前事务id的那条数据,根据undolog表可知,张三的age为20。


这就是MVCC的实现过程,下面用文字来描述下隔离级别的实现:


事务访问数据库时,先判断trx_id是否在m_ids里面


如果在,说明事务是活跃的,继续判断trx_id于ReadView中createor_trx_id的关系

相等,说明当前事务再访问自己的操作,可以访问;


不等,说明当前事务访问的是其他活跃的未提交事务的数据,无法访问。


如果不存在于m_ids中,继续判断trx_id与ReadView中的max_trx_id的关系


若trx_id>=max_trx_id,说明访问的最新的数据是在当前事务后面的操作,无法访问

若trx_id<max_trx_id,说明访问的最新数据是当前事务之前已提交的数据,可以访问


结语


就写到这里吧,关于数据库的数据结构其实还有一些,比如索引,索引的底层B+tree,不过这些东西也很多,准备单独分出来说,咱们下一篇再见。码字不易,觉得还不错,就给个赞吧!

目录
相关文章
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
3月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
193 1
|
3月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
3月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
149 0
|
4月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
257 3
|
4月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
246 2
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
161 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
788 152

热门文章

最新文章