定义:
锁是计算机协调多个进程或线程并发访问某一个资源的机制
在数据库中,除了传统的计算资源(如CPU,RAM,I/O等)的争用以为外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.
锁的分类 :
从对数据操作的粒度分 :
- 表锁
- 行锁
从对数据操作的类型(读\写)分 :
- 读锁(共享锁) : 针对同一份数据,多个读操作可以同时进行而不会互相影响
- 写锁(排他锁) : 当前写操作没有完成前,他会阻断其他写锁和读锁
开销,加锁速度,死锁,粒度,并发性能,只能就具体应用的特点来说哪种锁更合适
表锁(偏读) : 偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概念最高,并发度最低
查看表锁
show open tables;
手动增加锁
lock table 表名字 read/write,表名字2 read/write ,…;
解锁
unlock tables ;
分析表锁定
show status like ‘table%’;
加读锁 : 

总结 :
- 加了读锁,本session,和其他session都可以读本表
- 本session不可以读其他表,而其他session可以读其他表也可以读本表
- 本session更新,插入数据本表或其他表都会提示错误,其他session可以更新,插入没有锁定的表
- 其他session更新,插入锁表时,会进入阻塞状态,等待缩表解锁(unlock tables) 后,就会执行更新,插入操作
加写锁 : 
- 加了写锁,本session对本表可以读,更新,插入都可以 ,其他session都不能对锁表,会阻塞,等待锁的释放,锁一释放就会查询出结果
- 本session不能对其他的表进行读,写操作,其他seesion可以对没有锁的表进行
MyISAM在执行查询语句(select) 前,会自动给涉及的所有表加上读锁,在执行增删改操作前,会自动给涉及的表加上写锁

M有ISAM的读写锁调度是写优先,这也是myisam不适合做为主表的引擎,因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难的到锁,从而造成永远堵塞
行锁(编写 ) : 偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高
InnoDb与MyISAM最大不同点,意识支持事务(transaction),二是采用了行级锁
无索引行锁升级为表锁
间隙锁 : 当我们使用范围条件而不是相等条件检索数据,并请求共享或者排他锁,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内,但是并不存在的记录,叫做间隙(GAP)
如何锁定一行
总结 :
- innodb存储引擎由于实现行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表记锁定会跟高一些,但是在整体并发处理能力方面远远优于MyISAM的表级锁定.当系统并发量较高的时候,Innodb的整体性能和MyISAM相比就会有比较明显的优势了
- 但是innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MyISAM高,甚至可能会更差
分析行锁定
show status like ‘innodb_row_lock%’ ;

优化建议 :
- 尽可能让所有的数据检索都通过索引来完成,避免无索引引用锁升级为表锁
- 合理设计索引,尽量缩小锁的范围
- 尽可能减少检索条件,避免间隙锁
- 尽量控制事务大小,减少锁定资源量和时间长度
- 尽可能低级别事务隔离
页锁 : 开销和加锁时间介于表锁和行锁之间,会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
