一、锁的粒度
1.行级锁:
(1)所有的当前读都要加排它锁。比如:select for update、update、delete。
(2)是作用在索引上(聚簇索引&二级索引)。
(3)唯一索引/非唯一索引*RC(提交读)/RR(可重复读),四种搭配情况不一样。需要注意。
2.表级锁:
(1)加锁场景:lock tables、全盘扫描(加锁之后Mysql Sercer会进行过滤,会尽快释放锁)。
(2)尽量避免使用全盘扫描,虽然全盘扫描释放锁的过程很快,但是还是有加锁的过程。
3.间隙锁:
(1)间隙锁不是作用在索引上的,是两个位置之间的GAP。
(2)保证两次当前读返回的数据一致。
二、锁的类型
1.共享锁(读锁):可以同时被多个事务获取,阻止其他事务对纪录的修改;
2.排它锁(写锁):只能被一个事务获取,允许获得锁的事务进行修改;
三、死锁
1.产生死锁的原因:两个或者多个事务对同一个资源相互占用,并请求锁定对方占用的资源,从而导致的一个恶性循环现象。
2.InnoDb的处理方法:将持有最少行级排它锁的事务进行回滚。
四、锁的释放
1.锁释放的时机:锁在事务提交(commit)时释放。