15人参与 • 2025-07-21 • Mysql
在数据库管理系统中,事务隔离级别(transaction isolation levels)决定了事务之间如何相互隔离,以防止数据不一致和其他并发问题。mysql 提供了四种标准的事务隔离级别,每种级别在并发性能和数据一致性之间有不同的权衡。本文将详细介绍这四种隔离级别,包括它们的定义、特点、优缺点以及适用场景。
事务隔离级别定义了事务在执行过程中如何与其他事务隔离,以确保数据的完整性和一致性。不同的隔离级别通过不同的锁机制和并发控制策略来实现,从而在并发性能和数据一致性之间取得平衡。
mysql 支持 ansi sql 标准定义的四种事务隔离级别,按照隔离程度从低到高依次为:
脏读就是一个事务读取到了另一个事务还没有提交的数据
不可重复度就是一个事务两次相同的sql,查询结果返回的结果却不一样,由于另外一个事务修改并提交导致的
幻读就是插入的时候提示已经有了,但是查询的时候是空的
定义
在此隔离级别下,事务可以读取其他事务尚未提交的修改(脏读)。这意味着一个事务可以看到另一个事务尚未提交的中间状态数据。
特点
优点
缺点
适用场景
示例
假设有两个事务 t1 和 t2:
定义
在此隔离级别下,事务只能读取已经提交的其他事务所做的修改。每个查询只会看到在该查询开始之前已经提交的数据。
特点
优点
缺点
适用场景
示例
定义
在此隔离级别下,事务在执行期间多次读取同一数据时,会看到一致的结果,即使其他事务已经修改了这些数据。mysql 的 innodb 存储引擎通过多版本并发控制(mvcc)实现这一点。
特点
优点
缺点
适用场景
示例
定义
这是最高的隔离级别,要求事务必须顺序执行,以避免并发问题。在此级别下,事务会对读取的数据加锁,防止其他事务对其进行修改或插入。
特点
优点
缺点
适用场景
示例
在 mysql 中,可以通过以下方式设置事务的隔离级别:
show variables like 'transaction_isolation';
或者
select @@global.transaction_isolation, @@session.transaction_isolation;
设置全局隔离级别会影响所有新连接,当前已经存在的会话不会受到影响。
set global transaction isolation level serializable;
设置当前会话的隔离级别,只影响当前会话及之后新建的子会话。
set session transaction isolation level read committed;
仅对下一个事务生效,事务结束后恢复到之前的隔离级别。
set transaction isolation level read uncommitted; start transaction; -- 事务内容 commit;
隔离级别 | 脏读(dirty read) | 不可重复读(non-repeatable read) | 幻读(phantom read) |
---|---|---|---|
read uncommitted | 可能发生 | 可能发生 | 可能发生 |
read committed | 不会发生 | 可能发生 | 可能发生 |
repeatable read | 不会发生 | 不会发生 | 可能发生(innodb 部分防止) |
serializable | 不会发生 | 不会发生 | 不会发生 |
场景:电商系统中,订单支付和库存扣减。
结果:库存数据不一致,可能导致超卖。
场景:银行转账系统,账户余额查询和更新。
结果:虽然避免了脏读,但同一事务内多次读取同一数据得到不同结果,可能导致逻辑错误。
场景:在线订票系统,查询和预订座位。
结果:确保了 t1 在事务内看到的一致性,避免了不可重复读和幻读。
场景:股票交易系统,订单匹配和执行。
结果:确保了数据的高度一致性,避免了所有并发问题,但牺牲了并发性能。
到此这篇关于mysql中隔离级别的4种小结的文章就介绍到这了,更多相关mysql 隔离级别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论