Mysql--基础知识点--109--SERIALIZABLE事务隔离级别

MySQL 的 SERIALIZABLE(串行化) 是最高的事务隔离级别。它通过强制事务串行执行来完全避免脏读、不可重复读和幻读,但会显著降低并发性能。

核心机制

在 InnoDB 中,SERIALIZABLE 的实现方式如下:

  • 自动对普通 SELECT 加锁

    所有普通的 SELECT 语句都会被隐式转换为 SELECT ... LOCK IN SHARE MODE(共享锁)。读取的每一行都会加锁,直到事务结束才释放。

  • 当前读(SELECT ... FOR UPDATE/SHAREUPDATEDELETE 的行为与 REPEATABLE READ 下一致,仍然使用行锁 + 间隙锁(Next-Key Lock)。

  • 锁冲突导致等待或超时

    如果一个事务要读取某行,而另一个事务正在修改(持有排他锁),则读取事务必须等待。同样,修改操作也必须等待其他事务释放共享锁。

与 REPEATABLE READ 的关键区别

特性 REPEATABLE READ SERIALIZABLE
普通 SELECT 快照读(无锁,基于 MVCC) 加共享锁(当前读)
并发读-读 无阻塞 无阻塞(共享锁兼容)
并发读-写 读不阻塞写(快照读) 读阻塞写(写事务等待读事务释放共享锁)
并发写-读 写阻塞其他写,但不阻塞快照读 写阻塞读(读事务等待写提交)
幻读处理 当前读用间隙锁避免,快照读无幻读 所有读都是当前读,自然无幻读
性能 较高 较低(大量锁等待)

使用场景与注意事项

  • 何时使用:只有在需要绝对数据一致性且并发极低的场景(如财务对账、某些批量操作)才考虑使用。多数情况下 REPEATABLE READ 已足够安全。

  • 死锁风险增加:由于加锁范围更广,事务之间更容易形成死锁。

  • 如何启用

    sql 复制代码
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    -- 或
    SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  • 默认隔离级别:MySQL 默认是 REPEATABLE READ,而不是 SERIALIZABLE。

简单示例说明阻塞

sql 复制代码
-- 事务 A
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
SELECT * FROM user WHERE id = 1;  -- 对 id=1 的行加共享锁

-- 事务 B(此时执行会阻塞,直到事务 A 提交或回滚)
BEGIN;
UPDATE user SET name='new' WHERE id = 1;  -- 需要排他锁,被 A 的共享锁阻塞

总结:SERIALIZABLE 通过让所有读操作都加锁来获得最高隔离性,但会严重限制并发,通常只在对数据一致性要求极高且写入很少的场景下使用。对于绝大多数应用,使用 InnoDB 默认的 REPEATABLE READ 即可获得足够的一致性保障。

相关推荐
隐于花海,等待花开2 小时前
窗口函数之排序函数详细解读及示例
大数据·数据库·hive
亚空间仓鼠2 小时前
关系型数据库MySQL(四):读写分离
android·数据库·mysql
Wyz201210242 小时前
SQL中如何处理GROUP BY的不可排序问题_ORDERBY与聚合
jvm·数据库·python
Polar__Star2 小时前
jsoup如何读取html
jvm·数据库·python
亚空间仓鼠2 小时前
关系型数据库MySQL(三):主从复制
数据库·mysql
a9511416422 小时前
怎么防范通过phpMyAdmin上传WebShell_禁止into outfile权限
jvm·数据库·python
InfinteJustice2 小时前
如何统计SQL分组汇总数据_详解GROUP BY与HAVING用法
jvm·数据库·python
zhangchaoxies2 小时前
如何使用 AWS Lambda 和 Python 获取 EMR 集群的标签列表
jvm·数据库·python
吕源林2 小时前
如何处理SQL插入后的数据一致性校验_使用Checksum比对
jvm·数据库·python