MySQL的事务隔离级别分为:串行读(Serializable)、未提交读(Read Uncommitted, RU)、提交读(Read Committed, RC)、可重复读(Repeatable Read, RR)。其中,可重复读是默认的隔离级别。SET TRANSACTION语句用于指定隔离级别,并一直保持有效直到事务终止或者重新指定隔离级别。
1)未提交读(Read Uncommitted, RU)隔离级别
使用以下语句将系统的隔离级别设置为未提交读级别:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
未提交读是限制性最弱的隔离级别,只要求对写操作加X锁,读取数据不需要加锁。该隔离级别可以避免丢失修改问题,但可能读取到其他未提交事务修改的数据,不能解决脏读、不可重复读、幻影读问题。
2)提交读(Read Committed, RC)隔离级别
使用以下语句将系统的隔离级别设置为提交读级别:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
提交读隔离级别中,数据的写操作需要加X锁,读操作不需要S锁,通过多版本并发控制(Multi-version concurrency control, MVCC),进行快照读 (Snapshot Read),以读取最新提交的历史数据的方式避免脏读。
3)可重复读(Repeatable Read, RR)隔离级别
使用以下语句将系统的隔离级别设置为可重复读级别:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
可重复读隔离级别中,数据的写操作需要加X锁,读操作不需要加锁,也是通过多版本并发控制 (MVCC) 机制,进行快照读(Snapshot Read)。快照在事务第一次执行SELECT 语句时生成,只有本事务更新数据时才更新快照,本事务执行过程中其它事务提交的数据变更是读取不到的。即无论事务执行过程中是否有其它事务提交了新的版本,该事务没有提交之前读到的都是该事务开始时的版本,以此种方式实现数据的可重复读和无幻影读。
4)串行读(Serializable)隔离级别
使用以下语句将系统的隔离级别设置为串行读级别:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
串行读是限制性最强的隔离级别。串行读级别要求对写操作加X锁,对读操作加S锁,读写互斥。以此实现插入、修改、删除数据时其它事务无法修改、也无法读取这些数据;读取数据时其它事务无法修改这些数据。