大家好,我是热心的大肚皮,皮哥。
锁
InnoDB锁的内存结构
直接上图,我们看看InnoDB中锁的结构。
InnoDB行锁的分类
在InnoDB存储引擎中,锁都对应一个结构,为了节约内存,会把符合要求的锁放到同一个锁结构中:
死锁
假设我们开启了两个事务T1和T2,如下。
执行顺序 | T1 | T2 |
---|---|---|
1 | begin; | |
2 | begin; | |
3 | select * from hero where id=1 for update; | |
4 | select * from hero where id=3 for update; | |
5 | select * from hero where id=3 for update; | |
6 | select * from hero where id=1 for update; |
通过上面的执行顺序可以发现,事务T1第5步执行时,在等待事务T2中的第4步,而事务T2中第6步在等待事务T1中的第3步,它们在互相等待,造成死锁,InnoDB中有个死锁检测机制,当检测到死锁时,会选择一个较小的事务进行回滚(指事务执行过程中增删改操作记录少的事务),而且会给客户端发送Deadlock found when trying to get lock。发生了死锁,我们一般会采用SHOW ENGINE INNODB STATUS命令来查看最近一次的死锁信息。
具体应用场景
读操作
SELECT ....FROM ..
SELECT ... LOCK IN SHARE MODE; -- 加读锁
SELECT ... FOR UPDATE; --加写锁
写操作