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:
                

     

     

 

posted @ 2021-04-17 16:36  kenodio哒  阅读(185)  评论(0)    收藏  举报