MySQL 支持的事务隔离级别
MySQL 支持四种事务隔离级别,分别是:
1. READ UNCOMMITTED(读未提交)
特点:允许事务读取其他事务尚未提交的修改。这种隔离级别允许发生“脏读”(dirty read),即一个事务可以读到另一个事务尚未提交的数据。
优点:这是隔离级别最低的选项,锁争用最小,性能最高。
缺点:可能出现脏读、不可重复读和幻读问题。
2. READ COMMITTED(读已提交)
特点:只能读取已经提交的数据,即一个事务只能读取到其他事务已经提交的结果,避免了脏读。这是大多数数据库(如 Oracle)的默认隔离级别。
优点:防止脏读。
缺点:可能出现不可重复读(non-repeatable read)和幻读问题。在同一个事务中,多次读取相同记录时,结果可能不一致,因为其他事务的提交会影响结果。
3. REPEATABLE READ(可重复读)
特点:确保在同一个事务中多次读取同一行数据时,结果是一样的,即便有其他事务修改了该行的数据并提交,也不会影响当前事务的读取。这是 MySQL 默认的隔离级别。
优点:防止脏读和不可重复读问题。
缺点:可能出现幻读问题。不过,MySQL InnoDB 引擎通过 MVCC(多版本并发控制) 技术避免了幻读。
4. SERIALIZABLE(可串行化)
特点:最高的隔离级别,所有事务都被强制按顺序执行,事务间的操作如同是串行执行的。它通过加锁的方式防止脏读、不可重复读和幻读问题。
优点:防止脏读、不可重复读和幻读,是最严格的隔离级别。
缺点:性能较低,因为事务被强制串行化执行,锁争用较多,影响并发性能。
各个隔离级别对比
如何查看和设置 MySQL 的事务隔离级别
查看当前事务隔离级别:
SELECT @@transaction_isolation;
设置事务隔离级别:
全局设置:
SET GLOBAL transaction_isolation = 'READ COMMITTED';
会话设置:
SET SESSION transaction_isolation = 'READ COMMITTED';
默认情况下,MySQL 使用 REPEATABLE READ
作为隔离级别,但可以根据具体业务场景选择合适的隔离级别。
License:
CC BY 4.0