最近在学习MySQL的锁机制和隔离级别,发现跟Oracle还是有比较大的差异。例如Oracle默认隔离级别是read committed,而MySQL默认是repeatable read。Oracle除了串行化,无法避免幻读。而MySQL在repeatable read级别下,通过next-key锁机制,避免了幻读的产生。记录一下理论理解以及实验验证。
InnoDB锁类型有如下几种:
共享锁(S)和排他锁(X);
意向锁(Intention locks);
行锁(Record lock);
间隔锁(Gap lock);
Next-key lock;
插入意向锁(Insert Intention lock)
1.共享锁和排他锁
InnoDB的行级锁分为共享锁和排他锁。共享锁(S)锁定一行用于读取,排他锁(X)锁定一行用于修改写入。
如果一个事务在一行数据上持有共享锁(S),其他事务也可以获取该行上的共享锁(S),这种情况是多个事务同时持有该行数据的共享锁(S);但其他无法获取该行上的排他锁(X)。
如果一个事务在一行数据上持有排他锁(X),其他事务无法获取该行以上两种类型的锁。
同时,InnoDB的行锁是通过索引实现的,如果列上没有索引,那么锁的粒度是表级的。
实验:t1表的id列上没有索引
MYSQL锁机制详解
最新推荐文章于 2021-11-26 18:49:38 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)