当前位置: 首页 > ds >正文

2025-06-09 java面试总结

问题:mysql的事务隔离级别和各自解决的问题?
事务的特性:原子性、一致性、隔离性、持久性
mysql的隔离级别分为
RU(read uncommitted)读未提交。

所有事务能看到其他事务未提交的数据,也称之为脏读(Dirty Read)。

RC (read committed) 读已提交。

满足事务的特性ACID,读到的是事务已经提交的数据。但是不可重复读:事务执行过程中,前后两次查询可能因为别的事务提交相同数据修改而结果不一致。也有MVCC,不过生成Read View的时机是每次查询时生成新的。

RR(repeat read) 可重复读

mysql默认的事务隔离级别,通过MVCC和锁机制实现可重复读。使用间隙锁和行锁解决幻读问题。只有在事务第一次进行select时生成read view视图。

Serializable 串行化

隔离级别最高的事务,每个事务排序执行,没有脏读、幻读、不可重复读的问题。

MVCC:多版本链并发控制,通过可见性规则和版本链实现事务的差异化访问。
行记录结构:

字段含义
DB_TRX_ID当前行的事务id
DB_ROLL_PTR回滚指针,指向undo日志段

Read View:读视图

字段含义
m_ids活跃事务id列表
min_trx_id活跃事务中最小事务id
max_trx_id系统下一个事务id,相当于max(m_ids)+1
creator_trx_id当前事务id

Read View创建时机:
read committed:读提交事务隔离级别下,是在每次select时创建;
repeat read:可重复读事务隔离级别下,是在第一次select时创建。

注意:repeat read 模式下执行update流程如下:
1.不会使用快照读(Read view),而是读取最新的主键索引所在行的记录;
2.若存在行锁或间隙锁,需等待锁释放
3.加排他锁(X锁)​​阻止其他事务修改或读取该行,加间隙锁(Gap Lock)​​防止其他事务在索引间隙插入新数据(解决幻读)
4. 生成新版本:修改数据后,生成新的Undo Log记录旧版本,更新聚簇索引的DB_TRX_ID为当前事务ID

事务的状态:已提交、已回滚、运行中

MVCC工作流程:

  1. 事务A启动,指定事务A的id=108;(如果是只读事务,不分配id,id=0);
  2. 事务A执行select * from user where id = 3;
  3. 事务A创建Read view,如下:
字段
m_ids[90,104,110]
min_trx_id90
max_trx_id111
creator_trx_id108

事务可见性:

行记录事务id是否可见不可见原因
110不可见事务id在m_ids活跃事务id数组中
108可见事务id为当前事务
111不可见事务id为max_trx_id,读视图创建后产生的事务
89可见事务id不在活跃事务数组中,并且小于最小活跃事务,说明是当前事务创建前已提交的事务
100可见事务id不在活跃事务数组中,并且小于最大活跃事务,说明是当前事务创建前已提交的事务
  1. 事务A执行update user set name= ‘newname‘ where id = 3;
    此时在id=3的行记录中生成版本链(版本链中包含未提交的事务)。
  2. 事务提交

不可重复读和幻读
不可重复读:事务中的前后两次查询因为其他事务的修改导致查询结果不一致。使用MVCC解决。
幻读:事务中前后两次查询因为其他事务插入数据而导致查询结果不一致。使用行锁和间隙锁解决。
当前读和快照读
快照读在事务第一次查询的时候生成read view,后面每次查询结果一致。
当前读:读的是主键索引上已提交最新事务id。
innodb锁的实现
行锁基于索引实现。
主键索引上加锁,会作用于主键索引记录节点。
普通索引上加锁,先在普通索引上加锁,再去主键索引上加锁。

  • 当使用主键索引或者唯一索引,并且条件精确匹配,只会加行锁,不会加间隙锁。
  • 当使用普通索引时,会加行锁和间隙锁。
  • 当没有命中索引时,加表锁。
    sql调优技巧
  • 优先使用主键索引,减少回表操作,降低锁竞争
  • 确保命中索引,避免全表扫描
http://www.xdnf.cn/news/13321.html

相关文章:

  • 新基建浪潮下:中国新能源汽车充电桩智慧化建设与管理实践
  • CC攻击与WAF的对抗战
  • 深入理解 Socket 的底层原理
  • 【前端】每日一道面试题7:WeakMap和WeakSet是干嘛用的,有哪些使用场景
  • Linux-08 ubuntu 的 chrome浏览器不能使用 搜狗 输入法,但是火狐可以
  • 高效总结多篇文献的AI工具推荐:如何用AI批量整理文献综述与笔记?
  • 2025-05-08-deepseek本地化部署
  • 单杠引体向上,助力消防智能考核
  • 软件定义车辆加速推进汽车电子技术的未来发展
  • 03_跨域问题解决
  • 在Zenodo下载文件 用到googlecolab googledrive
  • can通信传输bz2文件损坏解决方法
  • Linux字符串占用空间统计方法
  • Supervisor服务监督部署Python+Django应用
  • Docker环境下FileRise私有云盘在飞牛NAS的部署与穿透实践
  • Day10_C语言基础
  • 【黑客与安全】Linux系列命令之进程相关命令
  • 【论文阅读】:Weighted Graph Cuts without Eigenvectors:A Multilevel Approach
  • 如何使用Qwen-VL 2.5进行图像分割
  • 使用Python构建高效词汇表:N-Gram词频统计实战
  • 力扣 1456. 定长子串中元音的最大数目 的多解
  • 图数据在人工智能中的应用场景
  • 苍穹外卖-day03
  • 国防科技大学计算机基础课程笔记02信息编码
  • 基于梯度的中毒攻击
  • vue3+vite项目中使用.env文件环境变量方法
  • React Native 是什么?为什么学它?
  • 非功能需求
  • Axure设计案例之词云图设计
  • bed文件排序