MySQL中的锁

2021年11月22日 阅读数:2
这篇文章主要向大家介绍MySQL中的锁,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1、前言

平时开发都有用到数据库,也知道里面有锁的说法,那什么是锁? 锁有哪些做用? 有哪些锁?如下以MySQL8来讲
 

2、什么是锁

锁是用于管理对共享资源并发访问的一种机制, 且是数据库系统区别于文件系统的一个关键特性。
 

3、为何须要锁

举个现实生活中的例子:商品搞活动时,商品数少但价格优惠引来了不少用户抢购,若是在某一个时刻点有大量请求扣减这个商品数(db能hold住的状况),那么这个商品就有可能致使超卖。
​为何会这样呢,由于数据在某个时刻出现了不一致性。 因此为了保证一致性,则须要有锁的介入。
数据库系统使用锁是 为了支持对共享资源进行并发访问,提供数据的完整性和一致性。同时也会影响并发量
 

4、有哪些锁

Latch通常称为闩锁(轻量级的锁),由于其要求锁定的时间必须很是短。若持续的时间长,则应用的性能会很是差。
在InnoDB引擎中,Latch又能够分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操做临界资源的正确性,而且一般没有死锁检测的机制。
 
Lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。而且通常lock的对象仅在事务commit或rollback后进行释放(不一样事务隔离级别释放的时间可能不一样)。
 
 
Lock锁根据粒度主要分为表锁、页锁和行锁。不一样的存储引擎拥有的锁粒度都不一样。
表锁

表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。javascript

该锁定机制最大的特色是实现逻辑很是简单,带来的系统负面影响最小。因此获取锁和释放锁的速度很快。html

 

因为表级锁一次会将整个表锁定,因此能够很好的避免困扰咱们的死锁问题。java

固然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的几率也会最高,导致并发度大打折扣。mysql

 

表锁的语法很简单:
# 获取表锁
LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...
 
lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE
 
# 释放表锁
UNLOCK TABLES

示例sql

mysql> lock tables t read, t1 write;
Query OK, 0 rows affected (0.02 sec)

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

 

页锁数据库

页级锁定的特色是锁定颗粒度介于行级锁定与表级锁之间,因此获取锁定所须要的资源开销,以及所能提供的并发处理能力也一样是介于上面两者之间。另外,页级锁定和行级锁定同样,会发生死锁。并发

 

行锁高并发

行级锁定最大的特色就是锁定对象的粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。性能

因为锁定颗粒度很小,因此发生锁定资源争用的几率也最小,可以给予应用程序尽量大的并发处理能力而提升一些须要高并发应用系统的总体性能。行级锁定也最容易发生死锁。大数据

使用行级锁定的主要是InnoDB存储引擎。

 

总结

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的几率最高,并发度最低。

  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的几率最低,并发度也最高。

  • 页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度通常。

 

后面在详细说下Innodb中的各类锁。

 

 

5、参考

《MySQL技术内幕》

https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html