1. springframework.boot中@ConfigurationProperties
注意:这个注解,加了之后nacos配置如果修改了,会自动刷新。
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "a.b.c")
public class XXXConfig {
private Long userId;
}
2. @EventListener和事务
如果某个方法加了@Transactional,然后在方法的最后发了个事件,事件监听用@EventListener,而监听器,放到mq中一个任务,会发生什么?
待验证:由于事务是在方法结束之后提交的,如果方法的事务提交的特别慢,而mq中的任务消费的非常快,可能就会出现事务还没有提交,但是mq消费到了任务,和预期可能会不符。消费者看不到数据的最新状态。
3. select * from information_schema.innodb_trx;
查询当前活跃事务
4. mysql innodb 事务有哪些状态?
1. 活动状态(Active)
-
含义:事务正在执行中,尚未提交或回滚。
-
特点:
-
事务已开始(BEGIN 或隐式启动)。
-
正在执行 SQL 操作(如 INSERT、UPDATE、SELECT)。
-
持有相关的锁(如行锁、间隙锁等)。
-
转换:
-
如果事务执行完成所有操作并调用COMMIT,进入部分提交状态。
-
如果发生错误或显式调用 ROLLBACK,进入失败状态。
2. 部分提交状态(Partially Committed)
-
含义:事务已执行 COMMIT 命令,但尚未将修改持久化到磁盘(未完成最终的日志写入)。
-
特点:
-
InnoDB 的提交分为两个阶段:
3. 提交状态(Committed)
-
含义:事务已成功提交,修改已持久化到磁盘。
-
特点:
-
所有 Redo Log 已刷盘。
-
数据修改对其他事务可见(根据隔离级别)。
-
释放事务持有的锁(除非是长事务或存在其他依赖)。
-
转换:事务生命周期结束。
4. 失败状态(Failed)
-
含义:事务执行过程中发生错误(如死锁、违反约束、显式回滚等),无法继续执行。
-
特点:
-
事务未完成预期操作。
-
可能仍持有部分锁。
-
转换:
-
自动或手动调用ROLLBACK,事务进入中止状态。
5. 中止状态(Aborted)
-
含义:事务已回滚,所有修改被撤销。
-
特点:
-
使用 Undo Log(回滚日志)撤销已做的修改。
-
释放所有持有的锁。
-
转换:事务生命周期结束。
6. 隐式提交状态(Implicitly Committed)
-
含义:某些操作会导致隐式提交(即使未显式调用 COMMIT)。
-
触发条件:
-
执行 DDL 语句(如 CREATE TABLE、ALTER TABLE)。
-
设置 autocommit = 1 时,每条 SQL 语句自动提交。
-
执行某些管理命令(如LOCK TABLES)。
-
特点:隐式提交后,事务进入提交状态。
关键注意事项
-
锁的释放:
-
Redo Log 与持久化:
-
Undo Log 与回滚:
5. 抛出异常,俩参数,一个记录日志给开发看,另一个展示给用户
以前做的项目抛异常都只有一个参数,记录到日志中的和给用户看到的是一样的,想看一些导致异常的数据,需要自己打印日志。其实并不好,开发看到的和用户看到的不应该一样,分为两个参数就很好。
6. 本地敏感词校验和图片校验
问题:如果用户发布的是文章,1000字。怎么做敏感词校验?
至于图片,那就是CV领域的事了。
7. StateMachineBuilder
本来想用它来做打卡,但是没用上。简单了解了一下,以后可以用来做比较复杂的流程流转,比如订单流转。
8. Haversine 公式计算经纬度之间的距离
Haversine公式可以用来计算地球表面两点之间的最短距离,基于经纬度来计算。在实际应用中,考虑到地球并非完美球体,Haversine公式计算的是地球表面上的大圆距离(即沿球面最短路径)。
做个打卡,够用了。
9. ApplicationEventPublisher.publishEvent()
发出去的事件,执行的时候其实还是在一个线程内的,那么如果一个事件有多个监听,会先执行哪个监听呢?
-
如果没有显式指定顺序,监听器会按照它们在容器中注册的顺序依次执行。
-
使用 @Order 注解或者实现 Ordered 接口可以明确指定事件监听器的执行顺序。
-
如果某些监听器使用了 @Async 注解,它们的执行顺序可能会受到线程调度的影响。
10. stream().reduce
-
reduce() 是一种强大的工具,用来将流中的所有元素聚合成一个单一的结果。
-
它适用于各种聚合任务,比如求和、求积、连接字符串、找到最大值/最小值等。
-
使用 identity 参数时,返回值不为 Optional,适合流为空的情况。
BigDecimal totalWorkHours = new BigDecimal(0); for (Map.Entry<Integer, BigDecimal> entry : workHourMap.entrySet()) { BigDecimal value = entry.getValue(); totalWorkHours = totalWorkHours.add(value); }
BigDecimal totalWorkHours = workHourMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);import java.util.Arrays; import java.util.List;
public class ReduceExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用 reduce 找出最大值 int max = numbers.stream() .reduce(Integer::max) .orElseThrow(() -> new IllegalArgumentException("List is empty")); System.out.println("Max: " + max); // 输出: Max: 5 }}
11. Trie树(前缀树)
Trie树,也称为“字典树”或“前缀树”,是一种树形结构,专门用于处理字符串匹配问题。Trie树通过利用字符串之间的公共前缀来减少查询时间,从而提高查询效率。特别适合用于敏感词检测。
查找时间复杂度:查找时间复杂度为 O(m),其中 m 为待查找字符串的长度。