锁的概念

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,除传统的计算资源(如CPU、RAM、W/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

锁的分类

通过对数据类型的操作来分:

读/写

读锁:针对同一份数据,多个读操作可以同时进行而不会互相影响。

写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

通过对数据操作粒度来分

image.png
表锁:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

一些操作:
image.png

表锁

加读锁

image.png

当我们锁上mylock的时候,session1可以做一下操作,读mylock,但是不可以修改mylock表的数据(加了读锁,只读),不可以读别的表(因为你这个表已经被锁住了)。

session2就可以读mylock,也可以读别的表,但是不可以修改mylock(session2不拥有锁),会阻塞!。因为被锁住了,只能等待解锁。

加写锁

image.png

此时session1可以修改,查询自己,不可以读其他表

session2可以读别的表,如果要写mylock会阻塞,读也阻塞。

image.png

image.png

image.png

image.png

行锁

偏向innodb引擎,开销大, 加锁慢,会出现死锁;锁定的粒度最小,发送锁冲突的概率最低,并发度较高。

Innodb和myisam最大的差别:
①增加了事务功能
②采用行级锁

image.png

当session1修改第五行的数据,session2想修改第五行会阻塞。然后这时session1执行commit,session2仍然读不到修改后的数据(不可重复得,一个事务内mysql默认可以重复读),当session2也commit就可以读读到了!

索引失效,行锁变成表锁

当我们执行下面两个语句的话,是可以的!(互不相干)

image.png

现在session1的where b = 4000失去了他的单引号,完蛋,索引会失效(索引是varchar的b)!

image.png

间隙锁的危害

image.png

image.png
image.png

如何锁定一行?

image.png

总结

image.png
image.png