一 锁的概念
1.1 锁的作用
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
1.2 锁的分类
为了提高数据库的并发度,每次锁定的数据范围越小越好,理论上只锁定当前操作的数据的方案会获得最大的并发度,但是管理锁也是很耗费资源的事情(涉及锁的获取、检查和释放),因此需要在并发度
和性能
之间做取舍,这样就产生了锁粒度
的概念。
锁所影响的数据的范围称作锁的粒度,锁按照操作粒度从小到大可以划分为行锁
、表锁
、页面
。
从对数据操作的类型
1.读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
2.写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
从对数据操作的粒度分: 锁所影响的数据的范围称作锁的粒度,锁按照操作粒度从小到大可以划分为行锁
、表锁
、页面
。
二 行锁的操作
2.1 表锁的作用
1.表级锁会锁定整张表,是MySQL最基本的锁策略,能够避免死锁
2.并不依赖于存储引擎
(所有的存储引擎对于表锁的策略都是一样的)
3.表锁是开销最小
的锁(因为粒度大),但同时出现资源竞争的概率也高,并发性大打折扣
2.2 表级锁的S锁和X锁的使用场景
2.2 表级锁的S锁和X锁的使用场景
2.3 表锁的特点
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2.4 加锁和解锁的API
2.4.1 上锁的过程
lock table 表名字 read(write), 表名字2 read(write), 其他;
2..4.2 查看表加过的锁
show open tables;
2.4.3释放表加过的锁
unlock tables;
2.5 表锁的使用场景案例
2.5.1 加读锁情况
2.5.2 加写锁情况
2.5.3 总结
2.6 意向锁
2.6.1 意向锁的作用
1.InnDB存储引擎
支持多粒度锁
,它允许行级锁
和表级锁
共存冲突
2.意向锁
就是一种不与行级锁
冲突的表级锁
,表示"某个事务在该表的某些行持有锁或者准备持有锁"
意向锁分为两种:
1.意向共享锁:表示事务有意向对表中的某些行添加S锁。
SELECT ... FROM t LOCK IN SHARE MODE; -- 事务想要获取行级别S锁,必须先获取表级别的IS锁。
2.意向排它锁:表示事务有意向对表中的某些行添加X锁。
SELECT ... FROM t FOR UPDATE; - 事务想要获取行级别X锁,必须先获取表级别的IX锁
2.6.2 意向锁的结论
1.InnoDB
支持多粒度锁
,在特定场景下,行级锁
和表级锁
可以并存
2.意向锁之间互不排斥,但除了IS和S锁兼容外,意向锁会和 表级别的 共享锁、排它锁互斥
3.IS和IX是表级别的锁,不会和行级别的S、X锁冲突,只会和上面的表级别的锁冲突
4.意向锁在保证并发性的前提下,实现了表锁和行锁共存
,并且满足事务隔离性的要求