6.10 Mysql 事务 锁 面试题

发布于:2025-06-11 ⋅ 阅读:(23) ⋅ 点赞:(0)

mysql可能出现什么和并发相关问题?

  • 脏读:读到未提交事务的修改
  • 不可重复读:一个事务内两次读取不一致
  • 幻读:一个事务内两次读取记录数不一致

哪些场景不适合脏读,举个例子?

  • 银行系统
  • 库存管理系统
  • 在线订单系统

mysql的是怎么解决并发问题的?

  • 锁机制:行级锁、表级锁、页级锁等
  • 事务隔离:读未提交、读已提交、可重复读和串行化
  • MVCC:通过在数据库中保存不同版本的数据来实现不同事务之间的隔离

可重复读隔离级别下,A事务提交的数据,在B事务能看见吗?

在这里插入图片描述

Mysql 设置了可重读隔离级后,怎么保证不发生幻读?

尽量在开启事务之后,马上执行 select … for update 这类锁定读的语句,因为它会对记录加 next-key lock,从而避免其他事务插入一条新记录,就避免了幻读的问题。

串行化隔离级别是通过什么实现的?

是通过行级锁来实现的,序列化隔离级别下,普通的 select 查询是会对记录加 S 型的 next-key 锁,其他事务就没没办法对这些已经加锁的记录进行增删改操作了,从而避免了脏读、不可重复读和幻读现象。

MVCC实现原理

对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同。
在这里插入图片描述
在这里插入图片描述

一条update是不是原子性的?为什么?

是原子性,主要通过锁+undolog 日志保证原子性的
执行 update 的时候,会加行级别锁,保证了一个事务更新一条记录的时候,不会被其他事务干扰。
执行 update 的时候,会加行级别锁,保证了一个事务更新一条记录的时候,不会被其他事务干扰。

滥用事务,或者一个事务里有特别多sql的弊端?

  • sql太多,锁定的数据多容易造成大量的死锁和锁超时
  • 回滚会占用大量存储空间,事务回滚时间长
  • 执行时间长,容易造成主从延迟。主库执行完事务才会写入binlog

讲一下mysql里有哪些锁?

在这里插入图片描述

  • 全局锁:全库逻辑备份
  • 表级锁:元数据锁:对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。
  • 意向锁:为了快速判断表里是否有记录被加锁。

数据库的表锁和行锁有什么作用?

  • 表锁:整体控制、适用于大批量操作
  • 行锁:细粒度控制提高并发性能、减少锁冲突、适用于频繁单行操作

MySQL两个线程的update语句同时处理一条数据,会不会有阻塞?

在这里插入图片描述

两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞?底层是为什么的?

在这里插入图片描述

如果2个范围不是主键或索引?还会阻塞吗?

会锁住全表