一分钟理清Mysql的锁类型——《深究Mysql锁》

延伸阅读

三分钟了解Mysql的表级锁

五分钟了解Mysql的行级锁

一分钟深入Mysql的意向锁

我们常用的存储引擎就MyISAM和InnoDB。MyISAM存储主要就简单的表级别锁,下面只说InnoDB的各种锁类型。

InnoDB不仅支持行级别的锁,也支持表级别的锁。平常我们会听到各种锁,你是不是不仅迷茫它们怎么用的,还会迷茫它们 各自之间都是什么关系?

什么是乐观锁和悲观锁?

乐观锁和悲观锁是泛指,不是具体的锁。

乐悲锁:也叫乐观并发控制,它总是乐观的认为用户在并发事务处理时不会影响彼此的数据。

多版本并发控制个人认为就是一种乐观锁,具体参考:《Mysql概要》 里的MVCC。所以乐观锁我们自己也可以很轻松的实现,主要是在有中加一个version字段作为版本号。

 悲锁观锁:悲观锁会悲观的认为每次去拿的数据都会被别人修改。所以每次在拿数据的时候都会上锁,从而屏蔽可能违反数据完整性的操作。间隙锁、临键锁都属于悲观锁。

什是表锁和行锁?

 表锁和行锁也是泛指,不是具体的锁。

表级锁有:意向共享锁、意向排他锁、自增锁等。InnoDB的行锁都是实现在索引上的

行级锁有:共享锁、排他锁、记录锁

什么是共享锁(S锁)和排他锁(X锁)?

InnoDB引擎实现了标准的行级别锁,分别是共享锁和排他锁。

  • 拿共享锁是为了让当前事务去读一行数据。
  • 拿排他锁是为了让当前事务去修改或删除某一行数据。

一个事务拿到了当前数据行的共享锁,另一个事务也能马上拿到当前数据行的共享锁。

一个事务拿到了当前数据行的排他锁,则另一个事务不能立马拿到当前数据行的排他锁,因为它会被阻塞直到前一个事务释放。

设置共享锁:select * from user where id = 1 LOCK IN SHARE MODE;

设置排他锁:select * from user where id = 1 FOR UPDATE;

InnoDB到底有几种锁?

(1) 共享/排它锁(Shared and Exclusive Locks)

(2) 意向锁(Intention Locks)

(3) 记录锁(Record Locks)

(4) 间隙锁(Gap Locks)

(5) 临键锁(Next-key Locks)

(6) 插入意向锁(Insert Intention Locks)

(7) 自增锁(Auto-inc Locks)

临键锁是记录锁和间隙锁的组合。

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页