1.锁分类
从对数据操作的粒度分为:行锁和表锁
从对数据操作的类型分为:读锁(共享锁)和写锁(排它锁)
1.读锁:针对同一份数据,多个读操作可以同时进行而不会互相影响
2.写锁:当前操作没有完成之前,它会阻断其他写锁和读锁
2
MyISAM支持表锁,InnoDB支持表锁和行锁
3.MyIsam的表锁情况(读锁和写锁)
假设有两个客户端。当其中的一个客户端A对某个数据库中的某个表加了读锁之后,1.两个客户端都可以读取数据,2.A在没有释放锁之前,不能够读取其他表中数据,B客户端可以读取其他表的数据。3.A客户端不能修改其他表的数据,B客户端执行修改语句会阻塞,直到A客户端释放锁(unlock tables)。
假设有两个客户端。当其中的一个客户端A对某个数据库中的某个表加了写锁之后,1.A客户端可以读取数据,可以修改和增加数据。B客户端执行读取、修改、增加语句都会阻塞。
简而言之,读锁会阻塞写,但是不会阻塞读。写锁既会阻塞读,也会阻塞写。
MYISAM不适合做写为主的表的存储引擎,因为写锁后,其他的线程不能够做任何的操作,大量的更新会使查询很难得到锁。从而造成永远的阻塞。
4.锁的争用情况
1.show open tables
2.show staus like ‘table_locks%’
5.InnoDB行锁
特点:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也是最高。支持事务,采用了行级锁。
6.InnoDB行锁情况(读锁和写锁)
对于select语句,InnoDB不会加任何锁
对于update、delete、insert语句,InnoDB会自动给涉及到的数据行加排它锁
假设有两个客户端。当其中的一个客户端A对数据库中的某张表的某一行加了写锁,1.A可以修改数据,B修改数据会阻塞,等到A执行commit之后,才可以修改数据
如果不通过索引条件检索数据,或者索引失效,InnoDB行锁会升级为表锁
7.间隙锁
当我们使用范围条件,而不是使用相等条件检索数据,并请求共享锁或排它锁时,InnoDB会给符合条件得已有数据进行加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙”,InnoDB也会对这个“间隙”加锁。
可以缩小范围来尽量避免间隙锁