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

目录
相关文章
|
29天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
6天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
52 13
|
7天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
29 5
|
11天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
44 10
|
27天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
41 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
5天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
40 2
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
3月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
7月前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
50 2