1 锁

  • 锁是计算机协调多个线程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算机资源的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
  • 为了更好的应对高并发,封锁,时间戳、乐观锁、悲观锁都是并发控制采用的主要技术方式。

2 锁分类

  • 操作划分:
  • DML锁、DDL锁
  • 按锁的粒度划分:
  • 表级锁、行级锁、页级锁
  • 按锁级别划分:
  • 共享锁、排他锁
  • 按加锁方式划分:
  • 自动锁、显示锁
  • 按使用方式划分:
  • 乐观锁、悲观锁

3 锁的粒度划分

3.1 表级锁
  • 表级锁分为表共享锁和表独占锁。
  • 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率最高,并发度最低。
3.2 行级锁
  • 行级锁分为共享锁和排它锁。行级锁时MySQL中锁定粒度最细的锁。InnoDB引擎支持行级锁和表级锁,只有在通过索引条件检索数据的时候,才使用行级锁,否则就使用表级锁。
  • 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度最高。
3.3 页级锁
  • 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级锁,一次锁定相邻的一组记录。BDB支持页级锁。
  • 开销和加锁时间介于表锁和行锁自建;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

4 锁级别划分

4.1 共享锁
  • 共享锁又叫读锁,如果事务T对A加上共享锁,则其他事务只能对A再加共享锁,不能加其他的锁。获准共享锁的事务只能读数据,不能写数据。

用法:SELECT … LOCK IN SHARE MODE;

4.2 排它锁
  • 排它锁又叫写锁,如果事务T对A加上共享锁,则其他事务都不能对A加任何类型的锁。获准排它锁的事务既能度数据,又能写数据。

用法:SELECT … FOR UPDATE

5 使用方式分

5.1 悲观锁
  • 乐观并发控制和悲观并发控制是并发控制采用的主要方法。
  • 悲观锁:PCC Pessimistic Concurrency Controller。悲观锁是指在数据处理过程,使数据处于锁定状态,一般使用数据库的锁机制实现。
  • 备注:在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0。MySQL默认使用自动提交auto commit模式,也就是你执行一个更新操作,MySQL会自动将结果提交。
  • 悲观锁优缺点:悲观并发控制采用“先取锁再分”
    的保守策略,为数据处理提供了安全的保证。但在效率方面,加锁机制会产生额外的开销,增加产生死锁的机会。
5.2 乐观锁
  • 乐观锁:相对于悲观锁来说,乐观锁是通过记录数据版本的方式实现乐观锁。为数据增加一个版本标识,读取数据时,将版本标识一起读出,数据每更新一次,就对版本标识进行更新。
  • 乐观锁优缺点:乐观锁认为事务直接竞争的概率时很小的,在提交的时候才锁定,所有不会产生死锁。但是如果两个事务同时读取数据库的某一行,这时,就会发现乐观锁的弊端。

6 MySQL常用存储引擎的锁机制

  • BDB:支持行级锁和表级锁,默认是页级锁。
  • InnoDB:支持行级锁和表级锁,默认是行级锁。
  • MyISAM & Memory:都是采用表级锁。