1 自我介绍 由于我简历是后端 所以面试官问的全是后端的
2 你觉得你项目中最有难度和成就感的部分是什么 它是怎么实现的
3 拷打项目 你是用了什么工具来模拟并发 然后知道你的代码让无效查询下降多少的
4 然后是sql场景题 什么是事务 四大特性你MySQL用的什么引擎 特点 如果让你建立表 怎么保障他们之间的联系(这个记不太清 不确定是不是这么问 没答好) 修改删除操作失败后的回滚怎么实现
什么是事务
事务:一组操作 要么全部成功 要么全部失败
四大特性
ACID 原子性 一致性 隔离性 持久性
事务的四大特性和实现原理 1原子性:一个事务中的多个操作,要么全部成功,要么全部失败 a依赖 Undo Log (回滚日志)保证 2持久性:一个事务被提交后,对数据的改变是持久的,即使数据库发生故障,恢复后数据依然存在 a依赖 Redo Log (重做日志)保证 3隔离性:通过 锁和MVCC 机制控制事务之间的可见性和操作冲突(并发事务之间互不影响) a依赖 Mvcc(多版本并发控制)和锁机制 保证的 4一致性:执行事务前后,数据保持一致,例如转账业务,无论事务是否成功,事务前后总额不变 a只有实现了原子性+持久性+隔离性,才能实现一致性
前三者 原子性、持久性、隔离性 都是手段,一致性才是目的
你MySQL用的什么引擎 特点
InnoDB
一、InnoDB支持事务,MyISAM不支持 二、InnoDB 是聚集索引,MyISAM 是非聚集索引。MyISAM是采用了一种索引和数据分离的存储方式,Innodb的聚簇索引中索引和数据在一起。 三、InnoDB支持外键,MyISAM不支持 四、InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。 五、InnoDB不支持FULLTEXT类型的索引(5.6之前不支持全文索引) 六、InnoDB中不保存表的行数,但是MyISAM只要简单的读出保存好的行数即可 七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
5 什么是死锁 让你模拟死锁实现
产生死锁的四个必要条件:
- 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待:有一组等待进程 {P0, P1,..., Pn}, P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,……,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。 只要上述条件之一不满足,就不会发生死锁。
产生死锁的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3)不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 1. 破坏不可抢占:设置优先级,使优先级高的可以抢占资源
- 破坏循环等待:保证多个进程(线程)的执行顺序相同即可避免循环等待。 如执行顺序都是:A->B->C,那就可以避免循环等待。 最常用的避免方法就是破坏循环等待,就是当我们有多个事务的时候,最好让这几个事务的执行顺序相同。 如事务1:A->B->C ,事务2:C->D->A,这种情况就有可能导致死锁。 即事务1占有了A,等待C,而事务2占有了C在等待A。 所以,要避免死锁就把事务2改为:A -> D-> C。
6 什么是spi机制
SPI (Service Provider Interface) 是一种设计模式,常用于 Java 等编程语言中,主要用于解耦接口与实现之间的关系,提供了可插拔的架构。它使得程序可以根据需要动态地加载和使用不同的服务实现,而不需要修改现有的代码。SPI 允许系统在运行时灵活地选择实现服务的方式,而无需硬编码具体的实现类。
SPI 机制的核心概念:
- 服务接口:SPI 机制首先定义一个接口或抽象类,称为服务接口。这个接口定义了服务的行为(例如功能方法)。例如,一个日志记录系统可能会定义一个
Logger
接口,来规定日志记录的行为。 - 服务实现:每个实现了服务接口的类被称为服务提供者(Service Provider)。这些实现类提供了具体的功能或行为。例如,
FileLogger
或DatabaseLogger
等都可以是Logger
接口的实现。 - 服务加载:SPI 机制通过配置文件来加载具体的服务实现。通过指定服务接口和对应的实现类,系统可以在运行时动态加载相应的服务提供者(实现类),从而达到扩展和替换的目的。
- 配置文件:在 SPI 机制中,通常会使用配置文件来列出所有可用的服务实现。例如,在 Java 中,
META-INF/services/
目录下的配置文件会列出所有实现了某个接口的具体类。例如,META-INF/services/com.example.Logger
配置文件可能包含多个实现类,像com.example.FileLogger
和com.example.ConsoleLogger
,系统就可以根据需要选择使用哪个实现。
SPI 机制的工作流程:
- 定义服务接口:首先定义一个服务接口或抽象类,指定该服务的功能。例如,日志服务可能包含一个
log(String message)
方法。 - 实现服务接口:实现服务接口的具体类提供该服务的实际实现。例如,
ConsoleLogger
实现了log
方法,输出到控制台;FileLogger
实现了log
方法,输出到文件。 - 创建服务提供者配置文件:创建一个配置文件,列出服务接口和其对应的服务提供者类。这些配置文件通常位于
META-INF/services/
目录下。例如,文件META-INF/services/com.example.Logger
列出所有的Logger
接口实现类。 - 加载服务提供者:应用程序可以通过 SPI 机制动态加载适当的服务实现。在 Java 中,使用
ServiceLoader
类来加载和实例化服务提供者。ServiceLoader
会读取META-INF/services
目录下的配置文件,自动加载相应的实现。
7 什么是消费幂等性
8 ConcurrentHashMap是怎么实现并发安全的 锁的升级怎么实现的
1.8之前时分段锁实现 1.8之后CAS和synchronized
9 http协议底层是怎么实现可靠传输的 介绍tcp嘛
http 1.0 1.1 2 3
1.0非持久连接
1.1持久连接 对同一时间同一域名的请求有数量限制
2
- 二进制分帧
- 多路复用
- 服务端推送 用户的浏览器和服务器在建立连接后,服务器主动将一些资源推送给浏览器并缓存起来的机制。有了缓存,当浏览器想要访问已缓存的资源的时候就可以直接从缓存中读取了。
- header压缩 头部带有大量信息 每次需要重复发送 http2使用hpack头部压缩算法压缩
10 介绍线程池设计 用处 优点
11 get和post接口的区别
12 最后算法出了个计算多叉树的高度
13平时用大模型吗 简单问问
链接:https://www.nowcoder.com/feed/main/detail/7f913625ff844adc8094363ecdb6cf81?sourceSSR=search
- Read View:它是事务在读取数据时的快照,表示在事务执行时,当前系统中活跃的事务及相关信息。通过 Read View,数据库可以判断事务对某些记录的可见性。
- 事务 ID(trx_id):每个事务都有一个唯一的 ID,通常是自增长的。事务 ID 用来表示事务的顺序,即哪个事务先发生。
- 活跃事务列表 (trx_ids):在创建 Read View 时,系统会记录当前活跃的读写事务的事务 ID 列表。活跃事务是指在当前事务开始时仍然未提交或仍在进行中的事务。
- 低限 (low_limit_id) 和上限 (up_limit_id):
- low_limit_id:这是下一个事务应该分配的 ID,意味着任何事务 ID 小于它的事务都在当前事务的 视图生成之前 就已经提交。
- up_limit_id:这是未提交的事务中最小的事务 ID,意味着任何事务 ID 大于它的事务要么正在进行,要么未提交。
- creator_trx_id:表示生成该 Read View 的事务 ID。
具体流程:
当某个事务需要读取一条记录时,它会查看该记录的 db_trx_id(即最新修改该记录的事务 ID),然后根据事务 ID 和 Read View 中的信息来判断记录是否对当前事务可见。具体规则如下:
1. trx_id < up_limit_id
- 如果
trx_id
小于up_limit_id
,说明该事务 在生成 Read View 之前已经提交。因此,该记录对当前事务是可见的。
2. trx_id > low_limit_id
- 如果
trx_id
大于low_limit_id
,说明该事务是在 生成 Read View 后 才创建的。根据事务的时间顺序,该事务对当前事务是不可见的。
3. up_limit_id < trx_id < low_limit_id
- 这种情况下,即
trx_id
在up_limit_id
和low_limit_id
之间,表示该事务是在 Read View 生成期间活跃的。此时,数据库会通过比较trx_id
是否存在于活跃事务列表trx_ids
中来判断可见性:- 如果
trx_id
在trx_ids
中,说明该事务在当前事务开启时仍然活跃,那么该记录对当前事务 不可见。 - 如果
trx_id
不在trx_ids
中,说明该事务在当前事务开启时已经提交,所以该记录对当前事务 可见。
- 如果
- 例外:如果
trx_id == creator_trx_id
(即当前事务就是创建 Read View 的事务),那么该记录无论如何都对当前事务 可见。
不可见的情况及 undo log
:
当某个记录的事务 ID 不符合 Read View 的可见性规则时,意味着该记录在当前事务中的可见性是 不可见的。此时,系统会查找 undo log 来回溯数据的历史版本(快照)。
- undo log:它是数据库在事务执行过程中记录的数据变更日志。每次数据被修改时,系统都会将修改前的数据(旧值)保存在 undo log 中。通过 undo log,系统能够恢复数据的历史状态。
- 如果数据库通过判断发现该记录不可见,它就会从 undo log 中查找该记录的历史版本,直到找到一个满足 Read View 可见性规则的版本为止。如果找到了合适的历史快照,它会返回该快照。如果找不到合适的历史版本,返回空表示该记录在当前事务视图下是不可见的。1 自我介绍 由于我简历是后端 所以面试官问的全是后端的
2 你觉得你项目中最有难度和成就感的部分是什么 它是怎么实现的 答的关于redis的然后开始深挖
3 拷打项目 你是用了什么工具来模拟并发 然后知道你的代码让无效查询下降多少的
4 然后是sql场景题 什么是事务 四大特性你MySQL用的什么引擎 特点 如果让你建立表 怎么保障他们之间的联系(这个记不太清 不确定是不是这么问 没答好) 修改删除操作失败后的回滚怎么实现
5 什么是死锁 让你模拟死锁实现
6 什么是spi机制
7 什么是消费幂等性
8 ConcurrentHashMap是怎么实现并发安全的 锁的升级怎么实现的
9 http协议底层是怎么实现可靠传输的 介绍tcp嘛
10 介绍线程池设计 用处 优点
11 get和post接口的区别
12 最后算法出了个计算多叉树的高度
13平时用大模型吗 简单问问
链接:https://www.nowcoder.com/feed/main/detail/7f913625ff844adc8094363ecdb6cf81?sourceSSR=search
回复