【MySQL】锁

目录

1. 为什么要有锁

2. 数据库锁的种类

2.1 按照锁的粒度

2.1.1 行级锁

2.1.2 页级锁

2.1.3 表级锁

2.2 按照锁的类型

3. 数据库中的乐观锁和悲观锁

3.1 乐观锁

3.2 悲观锁

4. 死锁

​4.1 定义

4.2 解决方法


1. 为什么要有锁

锁是数据库系统区别于文件系统的一个特性,锁机制用于管理对共享资源的并发访问。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若没有锁对并发操作加以控制,就可能会读取和存储不正确的数据,破坏数据库的一致性和完整性。

2. 数据库锁的种类

2.1 按照锁的粒度

在关系型数据库中,分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。

2.1.1 行级锁

行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。

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

2.1.2 页级锁

页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 引擎支持页级锁。

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

2.1.3 表级锁

表级锁是  MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的 MYISAM 与 INNODB 引擎都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

加锁开销 行级锁 > 页级锁 > 表级锁,变更发能力 行级锁 > 页级锁 > 表级锁。

InnoDB支持行级锁和表级锁,默认为行级锁。

2.2 按照锁的类型

  • 共享锁:又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
  • 排他锁:又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。

3. 数据库中的乐观锁和悲观锁

为了实现数据库管理系统中的并发控制(即确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性),采取乐观并发控制(乐观锁)和悲观并发控制(悲观锁)的技术手段。

3.1 乐观锁

假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。

实现方式:乐观锁一般会使用版本号机制或CAS算法实现。

使用场景:适用于写操作比较少的情况,即冲突很少的时候,这样就减少了锁的开销,加大了系统的整个吞吐量。

3.2 悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。

实现方式:使用数据库中的锁机制。

使用场景:适用于写操作比较多的情况,一般会经常产生冲突。

4. 死锁


​4.1 定义

死锁是指两个或多个事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象,如果没有外力作用,事务都将无法推进下去。

4.2 解决方法

  • 超时机制,当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。
  • wait-for graph(等待图)检测死锁,在数据库中保存两种信息:锁的信息链表,事务等待链表,通过这两种链表构造出一张图,若这个图中存在回路,就代表存在死锁。这是一种较为主动的死锁检测机制,在每个事务请求锁并发生等待时都会判断是否存在回路,若有,就回滚 undo 量最小的事务。
  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。

活动地址:CSDN21天学习挑战赛

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值