MySQL 的 InnoDB 引擎支持四种事务隔离级别
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
默认隔离级别是 REPEATABLE READ
要修改隔离级别,可使用 SET TRANSACTION
命令在某次连接上修改,要设置服务器的隔离级别,可使用 --transaction-isolation
选项或修改配置文件,参考 Section 13.3.6, “SET TRANSACTION Syntax”
- REPEATABLE READ (可重复读)
这是 InnoDB 引擎的默认隔离级别,指在一个事务中,在同一个事务内的查询都是事务开始时刻一致的,一致性读会读取第一次查询建立的快照,所以多次相同的查询会获得相同的结果。会产生幻读问题,但 InnoDB 通过行锁和间隙锁 (Gap Locks) 解决了这个问题。
- READ COMMITTED (读提交)
一个事务只能看到其他事务的已经提交的更新,看不到未提交的更新,这是大多数数据库的默认隔离级别。会产生不可重复读问题。
- READ UNCOMMITTED (读未提交)
一个事务可以读到其他事务没有提交的更新。会产生脏读问题。
- SERIALIZABLE (序列化)
一个事务执行的时候其他事务不能够对被读的行进行写操作。这是事务隔离的最高级别,但效率很低。
MySQL 事务隔离的实现依赖于数据库的锁和 MVCC(多版本并发控制)