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,不过这些东西也很多,准备单独分出来说,咱们下一篇再见。码字不易,觉得还不错,就给个赞吧!

目录
相关文章
|
13天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
8天前
|
SQL 关系型数据库 API
HarmonyOs开发:关系型数据库封装之增删改查
每个方法都预留了多种调用方式,比如使用callback异步回调或者使用Promise异步回调,亦或者同步执行,大家在使用的过程中,可以根据自身业务需要进行选择性调用,也分别暴露了成功和失败的方法,可以针对性的判断在执行的过程中是否执行成功。
64 13
|
7天前
|
存储 前端开发 关系型数据库
鸿蒙开发:实现键值数据库存储
对于数据量比较的小的,我们直接选择轻量级的用户首选项方式即可,而对于数据量比较大的情况下,直接可以使用数据库,而对于相对来说,比较大的数据,我们就可以使用键值型数据库方式
|
13天前
|
存储 JSON 测试技术
【HarmonyOS Next开发】云开发-云数据库(二)
实现了云侧和端侧的云数据库创建、更新、修改等操作。这篇文章实现调用云函数对云数据库进行增删改查。
35 9
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
60 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
24天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
107 13
|
25天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
42 5
|
29天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
60 10
|
22天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
57 2
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。

热门文章

最新文章