百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

MySQL锁的基本概念(mysql锁介绍)

wxin55 2024-10-26 16:32 9 浏览 0 评论

锁机制

上一篇文章讲到了MySQL的事务,事务具有ACID( 原子性、一致性、隔离性和持久性),其中的隔离性就是通过锁的机制来实现,锁是用于解决隔离性的一种机制,锁机制是为了解决数据库的并发控制问题而产生的。如在同一时刻,客户端对同一个表做更新或查询操作,为了保证数据的一致性,必须对并发操作进行控制。同时,锁机制也为实现 MySQL 的各个隔离级别提供了保证

按锁的粒度区分:

表锁(Table Lock):

表锁是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。特点:开销小,加锁快;锁定粒度大。最常使用的MyISAM和InnoDB都支持表级锁定,表锁分为表共享读锁(共享锁)与表独占写锁(排他锁)。

行锁(Row Lock):

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

页锁(Page Lock):

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁加锁速度快,但冲突多,行级锁冲突少,但是加锁速度慢,而页级锁相对折中,一次锁定一页的数据。其特点是:锁定粒度、开销和加锁时间介于表锁和行锁之间,并发度一般,和行锁一样也会出现死锁。

间隙锁(Gap Lock):

属于行锁的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。

临键锁(Next-Key Lock):

也属于行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。

锁的级别区分:共享锁,排它锁,意向锁

共享锁(Share Lock):

共享锁又称读锁,简称S锁。当一个事务为数据加上读锁后,其他事务只能对该数据加读锁而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其加写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持对数据进行任何修改。

排他锁(Exclusive Lock):

排他锁又称写锁,简称X锁。当一个事务为数据加上锁后,其他事务将不能再为数据加任何锁,直到该锁释放之后其他事务才能对数据进行加锁。排他锁的目的是在数据修改的时候,不允许其他人同时修改,也不允许其他人读取,避免出现脏数据和脏读的问题。

意向锁:

意向锁是一种特殊的锁,他不会真正的去锁数据。可以把它理解为一种标识。它由MySQL自己维护不需要我们手动的去维护。它属于表层级的锁,不会针对某一个行业增加意向锁。 可以分为两种:意向共享锁和意向排它锁,简称为IS锁或IX锁。

  • 意向共享锁

当向一个表中的某一行数据增加S锁之前,MySQL会自动给这个表增加一个意向共享锁IS。用于标记这个表中的数据已经被增加了S锁,当其他事务想对这个表增加X锁的时候,会判断这个表是否有IS锁或者IX锁,如果有,则对表增加X锁失败。否则成功。

  • 意向排它锁

当向一个表中的某行数据增加X锁之前,MySQL会自动给这个表增加一个意向排它锁IX。用于标记这个表中的数据行已经被增加了X锁,当前其他事务想对这个表增加X锁的时候,会判断这个表是否IS锁或IX锁,如果有则直接返回加锁失败。否则加锁成功

按加锁策略区分:乐观锁,悲观锁

乐观锁:

顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

悲观锁:

顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: