MySQL 面试突击指南:核心知识点解析2

事务并发可能引发的问题

MySQL 是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有多个客户端与之连接,每个客户端与服务器连接后,可以称为一个会话(Session)。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是说,服务器可能同时处理多个事务。

1. 脏读 (Dirty Read)

脏读是指一个事务读取到了另一个事务修改但未提交的数据。

脏读示例

  1. 在事务 A 执行过程中,事务 A 对数据资源进行了修改,事务 B 读取了事务 A 修改后的数据。
  2. 如果事务 A 没有提交,而是回滚了(Rollback),则事务 B 读取的数据就是脏数据。

这种读取到另一个事务未提交的数据的现象就是脏读。

2. 不可重复读 (Non-repeatable Read)

不可重复读指的是在同一个事务中,两次读取同一记录时,结果不一致。

不可重复读示例

事务 B 读取了两次数据资源,在这两次读取的过程中,事务 A 修改了数据,导致事务 B 在这两次读取出来的数据不一致。

3. 幻读 (Phantom Read)

幻读是在事务执行过程中,另一个事务向事务正在读取的记录集中插入了新记录,导致前后读取结果不一致。

幻读示例

事务 B 前后两次读取同一个范围的数据,在两次读取的过程中,事务 A 新增了数据,导致事务 B 后一次读取到前一次查询没有看到的行。幻读强调读取到了之前未存在的记录。

什么是 MVCC?

MVCC (Multi-Version Concurrency Control),基于多版本的并发控制协议,是乐观锁的一种实现方式。它避免了许多加锁操作,降低了开销。MVCC 通过创建快照,允许多个事务并发读取不同版本的数据,从而实现读不加锁,读写不冲突,极大地提升了系统的并发性能。

InnoDB 支持的四种事务隔离级别及其区别

事务并发执行过程中可能遇到的一些问题按照严重性排序为:脏读 > 不可重复读 > 幻读。SQL 标准设立了四个隔离级别:

READ UNCOMMITTED:未提交读,可能发生脏读、不可重复读和幻读问题。
READ COMMITTED:已提交读,可能发生不可重复读和幻读问题,不会发生脏读问题。
REPEATABLE READ:可重复读,可能发生幻读问题,不会发生脏读和不可重复读问题。
SERIALIZABLE:可串行化,各种问题都不会发生。

事务隔离级别

MySQL 默认隔离级别为 REPEATABLE READ,可手动修改。查看当前会话默认的隔离级别:

SHOW VARIABLES LIKE 'transaction_isolation';

SELECT @@transaction_isolation;

查看事务隔离级别

MVCC 的底层实现原理

MVCC 依赖于记录中的隐式字段、undo 日志和 Read View 来实现。每行记录中除了自定义字段外,还有隐式定义的 DB_TRX_IDDB_ROLL_PTRDB_ROW_ID 等字段。

DB_TRX_ID 是最近修改该记录的事务 ID。
DB_ROLL_PTR 是回滚指针,指向该记录的上一个版本。

不同事务对同一记录的修改会形成版本链。事务进行快照读时会生成一个 Read View,记录并维护系统当前活跃事务的 ID。RC 和 RR 级别下 Read View 生成时机不同,导致两者快照读结果不同。

版本链示例:

创建演示表并插入数据:

CREATE TABLE teacher (
  number INT,
  name VARCHAR(100),
  domain VARCHAR(100),
  PRIMARY KEY (number)
) Engine=InnoDB CHARSET=utf8;

INSERT INTO teacher 
  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值