内容提要
MySQL隔离级别用于控制并发事务行为,体现ACID中的隔离性。常见并发异常包括脏读、不可重复读和幻读,MySQL通过共享锁、排他锁和间隙锁加以防止。四种隔离级别为:读未提交(允许所有异常)、读已提交(防止脏读)、可重复读(默认,防止脏读和不可重复读)、串行化(全部防止但性能最差)。可按会话或全局设置,以平衡数据一致性与性能。
延伸解读
隔离级别与锁的联动机制
MySQL通过共享锁、排他锁和间隙锁实现隔离级别。共享锁允许其他事务读取但阻止修改;排他锁则独占读写。间隙锁专门防止幻读,它锁定WHERE条件涉及的范围,阻止其他事务插入新行。例如,在可重复读级别下,若查询使用唯一索引,MySQL仅锁定匹配行;若未使用索引而全表扫描,则会锁定所有扫描行并加间隙锁。理解锁的行为有助于预判并发性能。
默认隔离级别的权衡
MySQL默认使用可重复读级别,它通过MVCC提供一致性快照,防止脏读和不可重复读,并在锁定读时使用间隙锁防止幻读。相比读已提交,可重复读在同一事务内多次读取结果一致,但可能因快照而看到较旧数据。串行化虽能防止所有异常,但隐式加共享锁导致并发度低、死锁风险高。选择时需在数据一致性与吞吐量之间平衡。
隔离级别的设置与作用域
隔离级别可在会话或全局级别设置。会话级使用SET TRANSACTION或SET SESSION语句,仅影响当前连接;全局级需CONNECTION_ADMIN权限,使用SET GLOBAL设置,只影响后续新会话,已存在的会话仍可自行更改。也可在MySQL启动时通过命令行参数或配置文件指定默认级别。这种灵活性允许针对不同应用需求调整,但需注意全局设置不会追溯已打开的连接。
Q&A
MySQL 的默认隔离级别是哪个?它有什么特点?
MySQL 的默认隔离级别是 REPEATABLE READ(可重复读)。它通过 InnoDB 的 MVCC 机制,在整个事务期间使用一致的数据快照,防止脏读、不可重复读和幻读。对于锁定读,如果查询条件使用了索引,MySQL 只锁定匹配的行;如果没有使用索引,则会锁定所有扫描到的行,并执行间隙锁以防止插入导致幻读。
脏读、不可重复读和幻读分别是什么?
脏读是指一个事务读取了另一个未提交事务修改的数据;不可重复读是指同一事务内多次读取同一行数据,由于其他事务的修改,结果不一致;幻读是指同一事务内多次执行相同查询,由于其他事务插入或删除行,返回的行数不同。
MySQL 的四种隔离级别分别能防止哪些并发问题?
读未提交(READ UNCOMMITTED)允许所有异常;读已提交(READ COMMITTED)防止脏读,但允许不可重复读和幻读;可重复读(REPEATABLE READ)防止脏读、不可重复读和幻读;串行化(SERIALIZABLE)防止所有异常,但性能最差。
如何在 MySQL 中设置隔离级别?
可以在会话级别设置:SET [SESSION] TRANSACTION ISOLATION LEVEL <level>;也可以全局设置:SET GLOBAL TRANSACTION ISOLATION LEVEL <level>(需要 CONNECTION_ADMIN 权限);还可以在启动时通过 --transaction-isolation=<level> 或配置文件 [mysqld] 下的 transaction-isolation 选项设置。
MySQL 中的共享锁和排他锁有什么区别?
共享锁允许其他事务读取被锁定的行,但阻止其他事务修改;排他锁则只允许持有锁的事务读取和修改该行,其他事务无法读取或修改。共享锁可以多个事务同时持有,而排他锁只能由一个事务持有。
间隙锁是什么?它如何防止幻读?
间隙锁是 MySQL 用于防止幻读的一种特殊锁。它根据 WHERE 条件锁定读取数据周围的间隙,阻止其他事务在间隙中插入新行,从而避免同一查询在事务内多次执行时返回不同的行集。