MariaDB 的事务隔离级别决定了事务之间的可见性和并发控制行为,共有四种隔离级别:
1. READ UNCOMMITTED(读未提交)
特点:
- 可以读取其他事务未提交的数据
- 可能出现脏读、不可重复读、幻读
- 性能最好,但数据一致性最差
适用场景:几乎不使用,仅用于特殊性能需求场景
2. READ COMMITTED(读已提交)
特点:
- 只能读取其他事务已提交的数据
- 避免脏读,但可能出现不可重复读、幻读
- Oracle、PostgreSQL 的默认隔离级别
适用场景:大多数业务场景,平衡了性能和一致性
3. REPEATABLE READ(可重复读)
特点:
- 保证同一事务中多次读取同一数据结果一致
- 避免脏读、不可重复读,但可能出现幻读
- MariaDB 的默认隔离级别
- 通过 MVCC(多版本并发控制)实现
适用场景:需要较高数据一致性的应用
4. SERIALIZABLE(串行化)
特点:
- 最高隔离级别,完全隔离事务
- 避免所有并发问题(脏读、不可重复读、幻读)
- 性能最差,可能导致锁竞争
适用场景:金融交易、库存管理等对一致性要求极高的场景
设置隔离级别
sql-- 查看当前隔离级别 SELECT @@tx_isolation; -- 设置全局隔离级别 SET GLOBAL tx_isolation = 'READ-COMMITTED'; -- 设置会话隔离级别 SET SESSION tx_isolation = 'REPEATABLE-READ'; -- 在事务中设置 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION;
并发问题说明
- 脏读:读取到其他事务未提交的数据
- 不可重复读:同一事务中多次读取同一数据得到不同结果
- 幻读:同一事务中多次查询返回不同数量的记录
选择建议
- 默认使用 REPEATABLE READ:MariaDB 的默认选择,适合大多数场景
- READ COMMITTED:适合读多写少、对一致性要求不高的场景
- SERIALIZABLE:仅用于对一致性要求极高的关键业务
- 避免 READ UNCOMMITTED:除非有特殊性能需求
合理选择隔离级别可以在性能和数据一致性之间找到最佳平衡。