概述
- 数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。
种类
-
表级锁
- 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制
- 实现逻辑非常简单,带来的系统负面影响最小
- 加锁和解锁的速度很快,表级锁一次会将整个表锁定,可以很好的避免困扰我们的死锁问题。
- 主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。
-
页级锁
- 锁定颗粒度介于行级锁定与表级锁之间,能力也介于二者之间,会发生死锁。
- 主要是BerkeleyDB存储引擎。
-
行级索
- 锁定对象的颗粒度很小,发生锁定资源争用的概率也最小
- 给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。
- 由于锁定资源的颗粒度很小,所以每次加锁和解锁需要做的事情也更多,消耗更大
- 行级锁定也最容易发生死锁。
- 加粗样式使用行级锁定的主要是InnoDB存储引擎。
- 共享锁(S)
- 共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
- 排他锁(X)
- 排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
- 为了让行级锁定和表级(意向)锁定共存,
- 意向共享锁(IS)
- 意向排他锁(IX)
- 共享锁(S)
-
死锁
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程
PS
- 在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。