Innodb下的事务隔离级别
事务一共有4个隔离级别,它们分别是:
- 读未提交(READ UNCOMMITED)
- 读提交(READ COMMITED)
- 可重复读(REPEATABLE READ)
- 可序列化(SERIALIZABLE)
从上到下数据一致性越强,性能越低。 一般常用的隔离级别是读提交 RC以及可重复读 RR。下面就来看这两个隔离级别下innodb的操作。
- 读提交(READ COMMITED)在该隔离级别下SELECT语句会进行读取快照,不会对记录加锁。而锁读则会进行加锁。
CREATE TABLE `t1`( `id` int AUTO_INCREMENT, `c1` int, `c2` int, PRIMARY KEY(`id`) USING BTREE, KEY `ix_c1`(`c1`) USING BTREE )Engine=InnoDB DEFAULT CHARSET=UTF8;

以上面的表为例,事务T1执行
SELECT * FROM t1 WHERE id=3 FOR UPDATE;

此时会读取到id=3的数据,并在该索引记录上施加记录排他锁,如上图蓝色标记,此时事务T2执行
UPDATE t1 SET c1=3 WHERE id=3;
会被阻塞,因为需要先在id=3的记录上加锁才会进行更新操作。
- 可重复读(REPEATABLE READ) 该隔离级别相比于RC,会额外增加间隙锁,以保证不会出现幻读
SELECT * FROM t1 WHERE c1=5 FOR UPDATE;
执行该语句会将[2,5],[5,6)的区间封锁,使用间隙锁(Gap Lcok):
![]()
之后则根据id在聚集索引中找到对应的记录并施加Record x-lock:
![]()



浙公网安备 33010602011771号