- 博客(35)
- 收藏
- 关注
原创 mysql的可重复读隔离级别解决了不可重复读和大部分幻读
1.在同一事务中,前后两次快照读都是读的都是不同的快照,因为它是RC(即读已提交),也就是说在两次快照读中间,另一个事务修改了数据并提交,那么它第二次读的时候也会读取这个改动。2.在同一事务中,前后两次快照读都是读的都是不同的快照,因为它是RC(即读已提交),也就是说在两次快照读中间,另一个事务插入了数据并提交,那么它第二次读的时候也会读取这个改动。4.如果是两次当前读,RC级别下,它只有行锁,没有间隙锁,所以并不能防止中间其他事务对数据的插入,所以也会出现幻读的问题。
2025-02-24 11:13:47
191
原创 Mysql innodb为什么要有Redo log和双写缓冲区
这时候就会开始进行执行redo log未执行完的操作,找到相关的数据页,在找到的时候,会进行checksum校验和的检查,这是每个数据页的最尾端记录的,用于校验每个数据页的完整性的,如果校验失败,则会去通过双写缓冲区进行恢复。因为redo log的重写操作的前提需要数据页保持完整,这时候我们可以在脏页刷盘之前,先不操作原来的数据页,先在一个临时的连续的磁盘空间(也就是双写缓冲区)中存储一下要修改的脏页内容。备注:如果刷盘失败后,数据页不完整,那至少双写缓冲区是完整的,因为双写缓冲区写完了才会开始写数据页。
2025-02-24 11:07:55
761
原创 MySQL undo log,redo log和bin log日志文件的生成时间点、层级归属、存储位置及生命周期详解
日志类型生成时间点生成层级内存 Buffer磁盘文件Buffer 刷盘时机磁盘文件清理机制Undo Log事务修改数据时存储引擎层(InnoDB)undo_001 或 ibdata1随 Redo Log 刷盘间接持久化Purge 线程清理(无长事务阻塞)Redo Log数据页修改时存储引擎层(InnoDB)提交时或每秒刷盘(依赖配置)Checkpoint 推进后循环覆盖Bin Log事务提交时服务层mysql-bin.000001 等。
2025-02-24 11:00:09
497
原创 在 MySQL 的 InnoDB 存储引擎中,脏页(Dirty Page)的刷盘(Flush)时机
1. 后台线程周期性刷盘触发机制:InnoDB 的 Page Cleaner 线程 会周期性地将脏页刷入磁盘,防止内存中脏页堆积。触发条件:脏页比例阈值:当 Buffer Pool 中脏页占比超过 innodb_max_dirty_pages_pct(默认 90%)时,触发异步刷盘。空闲时主动刷盘:系统空闲时,后台线程主动刷盘以减少突发 I/O 压力。相关参数:innodb_io_capacity:定义每秒可执行的 I/O 操作次数(影响刷盘速度)。innodb_max_dirty_pages_pct_lw
2025-02-24 10:59:27
616
原创 Redo Log 对于不完整的数据页不能直接覆盖写吗
脏页刷盘的不完整性:表现为页的部分内容被修改、元数据损坏或物理损坏,导致数据逻辑错误。Redo Log 的局限性:无法直接覆盖不完整页,需依赖双写缓冲区提供的物理完整性。恢复流程:通过双写缓冲区修复物理损坏的页。通过 Redo Log 重放增量修改,恢复逻辑一致性。最终结论:InnoDB 通过双写缓冲区和 Redo Log 的分层设计,确保了崩溃恢复时数据的 物理完整性 和 逻辑一致性,两者缺一不可。
2025-02-24 10:58:29
626
原创 在 MySQL 的 InnoDB 存储引擎中,部分数据库优化策略
操作同步性性能影响场景优化方向Redo Log 刷盘(=1)同步高并发写入调整刷盘策略(=2/=0)双写缓冲区写入同步写入密集型负载SSD 环境下关闭双写Binlog 刷盘(=1)同步主从复制 + 高并发写入调整刷盘策略(=N)行级锁竞争同步高并发修改同一行减少锁粒度、优化事务设计数据页同步读取同步Buffer Pool Miss 频繁扩大 Buffer Pool、使用 SSDCheckpoint 强制刷盘同步Redo Log 空间不足。
2025-02-24 10:57:56
550
原创 为什么说undo日志是逻辑日志,而redo日志是物理日志
Undo Log 是逻辑日志:记录行的旧值及如何回滚,支持事务撤销和 MVCC。Redo Log 是物理日志:记录数据页的物理修改,确保崩溃恢复后数据不丢失。协作关系:Undo Log 依赖 Redo Log 保证自身持久性,两者共同保障事务的原子性(Atomicity)和持久性(Durability)。
2025-02-24 10:56:44
818
原创 思考二阶段提交和三阶段提交
所以,这时候三阶段提交新增的一个CanCommit阶段的作用就体现出来了,它可以在纠结自动回滚和自动提交之前,先评估一下所有参与者执行事务的能力,这样在进入PreCommit阶段的时候,也就可以保证所有参与者都有执行事务的能力,PreCommit阶段就算等待协调者发起DoCommit阶段超时了,也可以自动提交,因为进入到PreCommit阶段也就说明所有参与者的本地事务大概率都能成功。1.1 二阶段在协调者如果宕机了,由于参与者没有等待超时机制,会导致事务一直阻塞,从而一直占用资源,最终导致系统奔溃。
2024-12-04 13:20:27
1013
原创 javaagent介绍和使用
javaagent字面意思java代理,其实就是类的代理,有点类似于jdk里面的对象的代理。它允许在java项目启动时或者运行时在外部对java项目中的类加载进行拦截和干预,比如对原先类的字节码进行删除或者修改之类的操作。
2024-10-31 17:49:31
796
原创 git reset命令
head指当前版本,head^指上一个版本,head^^指上上个版本,以此类推,简写方法head~n(n代表^的个数)刚写完的代码是在work工作区(简称工作区执行完git add之后的代码是在stage暂存区(add区执行完git commit之后的代码是在本地storage本地仓库(commit区执行完git push之后的代码是在远程storage远程仓库。
2024-10-17 13:31:31
354
原创 解决IDE查看java源码的时候Cannot download sources
平时小伙伴们查看maven依赖的jar包源码的时候,经常会出现class文件中只有反编译的代码,并没有注释,有时候我们其实想要看看某个方法的注释让我们更好的理解代码的逻辑。但是我们点击右上角的Download Sources却没有用,IDE会在右下角提示Cannot download sources。1.修改你的maven home path为你使用的maven就好了。2.此时点击右上角的Download Sources下载就能成功了。
2024-09-23 22:33:13
339
原创 Mac OS的IDE无法使用maven
IDE的控制台是zsh,而.bash_profile中配置的环境变量是要在使用bash控制台的时候才能起效,所以需要多配置一份.zshrc文件,这样就可以在zsh控制台上使用配置的环境变量了。1.将.bash_profile复制一份到.zshrc。2.按i进入vim编辑模式,输入内容。3.编辑完成后,按 Esc 退出编辑。4.按esc输入:wq进行保存退出。3.在文件内容末尾加入一行内容。2.编辑.zshrc。
2023-08-01 11:59:19
352
原创 The bean ‘dataTokenMapper‘ could not be injected because it is a JDK dynamic
The bean 'dataTokenMapper' could not be injected because it is a JDK dynamic proxy
2022-07-29 11:56:52
2578
原创 使用nginx对grpc进行反向代理和负载均衡
前言最近项目中需要给我们的grpc服务进行反向代理和负载均衡。故将这期间查阅的资料进行了整理记录相关链接介绍nginx负载均衡:https://blog.youkuaiyun.com/qq_51574197/article/details/117408823nginx对grpc进行反向代理:https://blog.youkuaiyun.com/Dearmark/article/details/80066819netty中http2的设计:https://my.oschina.net/u/1261452/blog/299
2022-05-30 17:38:15
5735
4
原创 ansible学习笔记
demo项目相关连接:https://github.com/liushuyu1/ansible-demoansible项目基本结构ansible-demo|-- demo-inventory.ini 这个是记录的主机的信息,比如主机的host,port,user,password|-- demo-playbook.yml 这个是剧本,里面主要记录在哪些主机上执行什么任务|-- group_vars 这个是组相关的变量的文件夹| `-- group1.yml 这个是group1的变量文件|
2022-05-18 17:02:04
136
原创 Navicat报错Cannot create file “xxxxx\_NAVICAT_DESIGNQUERY.sql.bak“. 系统找不到指定的路径
报错场景我新建了连接成功之后,想“新建查询”的时候报错:Cannot create file “xxxxx_NAVICAT_DESIGNQUERY.sql.bak”. 系统找不到指定的路径,或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。即北京时间要比格林威治时间多8个小时unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。[1]Unix时间戳(英文为Unix epoch, Un
2021-07-29 12:21:53
5879
原创 Gradle + Springboot + Jacoco offline模式+ SonarQube搭建
1.先新建一个常规web项目,有三个子模块:2.主要文件:gradle.properties,build.gradle,jacoco.gradlegradle.properties文件:定义了一些全局变量,如项目版本,springboot版本,sonar的账号密码等一些内容。springbootVersion=2.3.2.RELEASEprojectVersion=1.0-SNAPSHOT#sonarQube 配置systemProp.sonar.host.url=http://192.
2021-06-28 17:13:58
2472
1
原创 nginx location语法规则
1、location指令语法location [=||*|^~|@] /uri/ { … } 或 location @name { … }= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。为区分大小写匹配(可用正则表达式)!~为区分大小写不匹配~* 为不区分大小写匹配(可用正则表达式)!~*为不区分大小写不匹配^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。2、URI匹配模式location指令分为两种匹配模式:1>
2021-05-27 14:02:52
1594
原创 nginx proxy_pass规则
nginx部分配置格式server { listen 5000; server_name www.liushuyu.top; location /ccc/test { proxy_pass http://119.91.100.32:6000/test; }}server { listen 6000; server_name 119.91.100.32; location /test/ { alias /
2021-05-27 13:42:09
4770
原创 python requests发送post请求到java springboot报错no String-argument constructor/factory method to deserializ
spring 的参数解析器无法将传送过来的字符串解析为java对象,是因为python的json.dumps方法将json数据多包了一层。就是去掉json.dumps,直接传输data对象过去就行了。最近在学习python。
2021-04-16 14:56:23
1580
原创 CompletableFuture中的thenRun和thenRunAsync方法
需求:我需要在做完第一件事情后返回结果A,再做第二件事情,第二件事情依赖结果A。代码编程: @Resource(name = "globalThreadPool") private ThreadPoolExecutor threadPoolExecutor; CompletableFuture.supplyAsync(() -> { 做第一件事情; return A; },threadPoolExecutor).thenRun(()->{ 做第二件
2021-04-14 13:50:46
10012
10
原创 mybatis中使用查询max()函数返回-1
我要查询表中某个列的最大值:<insert id="selectMaxVersionByType">selectmax(version)from aton_agreementwhere type = #{type}</insert>结果一直返回-1改成以下形式:<select id="selectMaxVersionByType" resultType="java.lang.Integer">selectmax(version)from aton
2021-04-09 13:56:14
6497
2
原创 No tests found for given includes: [xxx.xxx.testList](filter.includeTestsMatching)
运行单元测试的时候报错: No tests found for given includes: (filter.includeTestsMatching) 解决方案加上依赖:testImplementation(“org.springframework.boot:spring-boot-starter-test:${springbootVersion}”)
2021-04-07 11:38:47
7236
1
原创 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
背景在阿里云买了个4C8G的数据库实例进行压测数据准备。在创建表的时候报错: ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 建表语句:CREATE TABLE `qrtz_triggers` ( `SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL, `TRIGGER_NAME` varchar(200) COLL
2021-04-03 10:40:33
369
转载 【转载】使用Nginx做反向代理时,如何查看web请求被落地到哪台服务器 怎么改配置才可以实现前端需求:查看请求到底落在哪台后端应用服务器?
【转载】使用Nginx做反向代理时,如何查看web请求被落地到哪台服务器怎么改配置才可以实现前端需求:查看请求到底落在哪台后端应用服务器?通过查阅文档,我们看到upstream模块有两个内置变量,一个是upstream_addr,一个是upstream_status, 配置这两个参数,可以查看到请求落在了后端的具体哪个server上配置如下:在server location加上这两个变量,通过添加请求头backendIP和backendstatus 来获取这两个变量的值。server {
2021-03-25 10:51:52
916
原创 java.lang.IllegalArgumentException: Invalid character found in method name [...] HTTP method names m
java.lang.IllegalArgumentException: Invalid character found in method name […] HTTP method names must be tokens记一个错误,详细原因后续有时间再深究接收请求报错:java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x000xb80x010x000x000xb40x030
2021-03-24 18:26:26
1813
3
原创 HTTP GET请求使用了请求体遇到的坑
最近开发项目的时候,与前端联调的时候遇到了一个坑:后端代码Controller代码: @GetMapping("/server/list") public R serverList(@RequestBody AtonNetServerListReq req){ List<AtonNetServerListResp> list = atonServerService.listAll(req); return R.ok().put("list",
2021-01-28 16:45:18
3431
原创 由ClassNotFoundException和NoClassDefError到类加载过程的思考
由ClassNotFoundException和NoClassDefError到类加载过程的思考结论:以下是楼主的论证过程场景1:使用Class.forName()去加载不存在的A类。以下是NoClassDefError的场景场景1:B类的class文件不存在,NoClassDefErrorTest类去编译场景2:B类的class文件,NoClassDefErrorTest类去编译,编译成功后再将B类的class文件删除场景3:B类的class文件,NoClassDefErrorTest类去编译,编译成功后
2021-01-26 15:31:51
968
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人