从应用的角度来看数据库锁可分为悲观锁、乐观锁
从数据库(InnoDB)的角度看,数据库锁可以分为行级锁和表级锁
1.1 什么是行级锁
InnoDB 存储引擎默认情况下,使用行级锁。行级锁是 MySQL 中锁定粒度最细的一种锁,它锁住的是行记录。行级锁可以大大减少数据库操作的冲突,但是加锁的开销也是非常大的。它具有如下特点:
由于开销比较大,加锁会很慢
锁定粒度小,所以锁冲突的概率低,并发度高
可能会出现死锁
1.2 什么是表级锁
表级锁是 MySQL 中锁定粒度最大的一种锁,它会锁住整张表。由于锁定粒度很大,它的实现会简单许多,资源消耗也会很低,大部分的存储引擎都支持表级锁,它具有如下特点:
由于开销比较小,加锁会很快
锁定粒度大,所以锁冲突的概率高,并发度低
不会出现死锁
1.3 MySQL 如何选择行级锁与表级锁
InnoDB 是否使用行级锁是通过索引来确定的,没有通过只能全表扫描使用的是表级锁
在有些特殊情况下是不成立的。例如,对于数据量很少的表,MySQL 会认为全表扫描更快,此时,即使使用索引字段查询,InnoDB 也会使用表锁,而不是行锁。
2.1 什么是悲观锁
在应用层面上以最坏的角度去对待并发的数据控制,认为共享数据被并发修改的可能性较高,在修改之前先去加锁 效率上,
缺点:处理加锁的过程会让数据库产生额外的开销,降低并发度,同时,还可能会有死锁的可能。<