2020-12-24 13:44:09
MySQL默认的事务隔离级别主要有四个标准级别,以及一个由配置决定的动态默认级别。具体如下:
Read Uncommitted(读取未提交)
该级别允许事务读取其他事务未提交的数据,是最低的隔离级别。其核心问题是脏读,即一个事务可能读取到另一个事务中途回滚的无效数据,导致数据不一致。此级别几乎不用于生产环境,因其无法保证数据的基本可靠性。
Read Committed(读取已提交)
事务只能读取其他事务已提交的数据,解决了脏读问题。但会引发不可重复读,即同一事务内多次读取同一数据可能得到不同结果(因其他事务在此期间修改并提交了数据)。此级别适用于对数据一致性要求中等、需兼顾并发性能的场景。
Repeatable Read(可重复读)
MySQL的默认隔离级别(当sql_mode包含STRICT_TRANS_TABLES等严格模式时)。事务内多次读取同一数据的结果始终一致,解决了不可重复读问题。但可能存在幻读,即同一事务内多次执行相同查询时,结果集可能因其他事务插入新数据而变化。此级别通过多版本并发控制(MVCC)实现,是MySQL的特色优化。
Serializable(串行化)
最高隔离级别,通过强制事务串行执行避免并发问题,彻底解决脏读、不可重复读和幻读。但会显著降低并发性能,仅适用于对数据一致性要求极高且并发量极低的场景。
动态默认隔离级别
MySQL的实际默认隔离级别由全局变量sql_mode决定:
用户可通过SET SESSION TRANSACTION ISOLATION LEVEL或修改全局变量transaction_isolation调整级别。选择时需权衡数据一致性与并发性能:高一致性需求选Repeatable Read或Serializable,高并发需求选Read Committed或更低级别。