- 博客(187)
- 收藏
- 关注
原创 MySQL进阶之(十四)MVCC-多版本并发控制
在 MVCC 机制中,多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在 undo log 里,如果一个事务想要查询这个行记录,需要读取哪个版本的行记录呢?这时就需要用到 ReadView 了,它帮助我们解决了行的可见性问题。ReadView 就是事务在使用 MVCC 机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照,InnoDB 为每个事务构造了一个数组,用来记录并维护系统当前活跃事务的 id(活跃指的就是,启动了但还没提交)。
2024-11-10 15:53:54
664
原创 MySQL进阶之(十三)MySQL锁机制
脏读的产生是因为当前事务读取了另一个事务未提交的记录,如果另一个事务再写记录的时候就给这条记录加锁,那么当前事务就无法继续读取该记录了,所以也就不会有脏读的问题产生了。不可重复读的产生是因为当前事务先读取了一条记录,另外一个事务对该记录做了改动之后并提交,当前事务再次读取时会获得不同的值,如果在当前事务读取记录时就给该记录加锁,那么另一个事务就无法修改该记录,也就不会发生不可重复读了。幻读。
2024-11-03 16:35:56
857
原创 MySQL进阶之(十一)MySQL事务日志-redo log
这个和磁盘的扇区有关,机械磁盘默认的扇区就是 512 字节,如果要写入的数据大于 512 字节,那么要写入的扇区肯定不止一个,这时就要设计到盘片的转动,找到下一个扇区,假设需要写入两个扇区 A 和 B,如果扇区 A 写入成功,而扇区 B 写入失败,那么就会出现非原子性的写入,而如果每次只写入和扇区的大小一样的 512 字节,那么每次的写入都是原子性的。对于使用 InnoDB 存储引擎的表来说,无论是用于存储用户数据的索引,还是各种系统数据,都是以【页】的形式存放在表空间中的。
2024-10-18 23:11:13
1195
原创 MySQL进阶之(十)事务和隔离级别
MySQL 事务主要用于处理操作量大、复杂度高的数据。比如:张三给李四转钱这个操作,必须同时完成两步:扣除张三账户中的钱、新增李四账户中的钱。这两步数据库操作就构成了一个事务。事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态。事务是数据库区别于文件系统的重要特性之一,有了事务就会让数据库始终保持一致性,同时还能通过事务机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。在 MySQL 中只有使用了InnoDB 存储引擎的数据库或表才支持事务。
2024-07-22 23:04:04
713
原创 MySQL进阶之(九)数据库的设计规范
在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,就必须满足一定的范式(Normal Form,简称:NF)。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前关系型数据库有六种常见范式,按照范式级别,从低到高分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。
2024-05-28 22:54:13
931
原创 MySQL进阶之(八)索引优化与查询优化
提前为下文做数据准备,两张表:学员表(student) 插入 50w 条数据,班级表(class) 插入 1w 条数据。
2024-05-16 22:46:16
912
原创 MySQL进阶之(七)EXPLAIN 详解
id 如果相同,可以认为是一组,自上往下顺序执行。在所有组中,id 值越大,优先级越高,越先执行。id 的每个值都代表一趟独立的查询,一个 sql 的查询趟数越少越好。
2024-04-10 22:10:43
1037
原创 MySQL进阶之(六)索引的使用与设计原则
① 冗余索引例如:通过 idx_name_birthday_phone_number 索引就可以对 name 列进行快速搜索,再创建一个专门针对 name 列的索引就算是一个冗余索引,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。② 重复索引col2 INT,例如:col1 既是主键、又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就会生成聚簇索引,所以定义的唯一索引和普通索引是重复的,这种情况要避免。
2024-03-28 22:05:59
1205
原创 MySQL进阶之(四)InnoDB数据存储结构之行格式
之所以要存储 NULL 值,是因为数据都是需要对齐的,如果没有标注出来 NULL 值的位置,就有可能。
2024-03-06 22:54:51
1446
原创 (五)Java 的内存模型 JMM
一方面,需要 JMM 提供一个强的内存模型来编写代码;另一方面,编译器和处理器希望 JMM 对它们的束缚越少越好,这样它们就可以最可能多的做优化来提高性能,希望的是一个弱的内存模型。JMM 考虑了这两种需求,并且找到了平衡点,对编译器和处理器来说,只要不改变程序的执行结果(单线程程序和正确同步了的多线程程序),编译器和处理器怎么优化都可以。而对于我们开发来说,JMM 提供了 happens-before 规则(JSR-133规范),满足了我们的需求——简单易懂,并且提供了足够强的内存可见性保证。
2023-07-17 16:37:20
226
原创 (四)并发编程带来了哪些问题?
CPU 是很宝贵的资源,速度也非常快,为了保证雨露均沾,通常为给不同的线程分配时间片,当 CPU 从执行一个线程切换到执行另一个线程时,CPU 需要保存当前线程的本地数据、程序指针等状态,并加载下一个要执行的线程的本地数据、程序指针等,这个开关被称为。这时线程 2 执行 get() 方法,首先会从主内存中读取 i 的值,然后加载到自己的工作内存中,这个时候读取到 i 的值是 50,再将 50 赋值给 j,最后返回 j 的值就是 50 了。然而,车道一旦多起来,也就意味着『加塞』的场景可能就会越来越多。
2023-07-06 14:53:47
611
原创 (三)线程组和线程优先级
可以看到终端或命令提示符界面没有任何输出,main 线程(非守护线程)在启动了 DaemonThread 线程之后随着 main 方法的执行结束而终止了,而此时 Java 虚拟机中已经没有非守护线程了,所以 Java 虚拟机需要退出,同时 Java 虚拟机中所有的线程都要立即终止,因此 DaemonThread 守护线程直接终止,finally 代码块中的语句并没有执行。由此可见,如果某个线程的优先级大于线程所在线程组的最大优先级,那么该线程的优先级将会失效,取而代之的是线程组的最大优先级。
2023-07-04 17:59:19
444
原创 (一)创建线程的三种方式
如果其他线程都执行完毕,main() 方法也执行完毕,JVM 就会退出,也就是停止运行。如果 JVM 都停止运行了,守护线程自然也就停止了。创建一个类实现 Callable 接口,重写 call() 方法,这种方式可以通过FutureTask获取任务执行的返回值。使当前正在执行的线程暂停指定的毫秒数,也就是进入休眠的状态。显然,这些概念是很抽象的。因为 run() 方法是用来封装被线程执行的代码。
2023-06-29 22:20:07
512
原创 Java中 new Integer 与 Integer.valueOf 的区别
Java中 new Integer 与 Integer.valueOf 的区别
2023-03-06 22:27:53
517
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人