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

目录
相关文章
|
1天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
14 6
|
1天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
12 4
|
3天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
16 4
|
7天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
9天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
22 3
|
8天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
9天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
23 2
|
9天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
23 2
|
9天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
13 1
|
9天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
24 1