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

百度T4码农,1分钟带你完全解读mysql中锁的类型和应用

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

作为mysql的初学者小白,很多人弄不懂mysql中有哪些锁,以及锁的分类和不同,笔者下面整理里下mysql中锁的分类,以及相应的操作事件方式!

mysql锁基础

锁类型

  • 表级锁:锁住一张表的数据 myisam、innodb
  • 页级锁:是锁一页的数据
  • 行级锁:锁住一行的数据 innodb

排它锁与共享锁

  • 先关闭事务自动提交模式,改为手动事务提交模式

set autocommit = 0;

  • 手动提交事务,模拟锁

开启事务

mysql> begin;

提交事务

mysql> commit;

  • 排它锁:for update

如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改特点:对检查的语句加排它锁

begin;

select * from member where id = 1 for update;

commit;

  • 共享锁:lock in share mode

共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。特点:对检查的语句加共享锁

begin;

select * from member where id = 1 lock in share mode;

commit;

  • 当前读取:一般只是加锁的select
  • 快照读取:一般只是没有加锁的普通查询
  • 锁应用总结:排它锁:排它锁与排它锁和共享锁不能一起使用,排它锁与不能一起使用。共享锁:共享锁与共享锁可以一起使用。对于update、insert、alter等写操作,mysql在事务中会自动加上一把排它锁。普通查询不受加锁的影响,他依然可以获取加锁后的数据
  • 高并发场景中

乐观锁与悲观锁

悲观锁、乐观锁只是一种锁的概念,并不是MySQL中的一种锁。
  • 乐观锁乐观锁,比如MVCC

共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

  • 悲观锁 对数据的修改持有悲观态度的并发控制方式。

总是假设最坏的情况,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

死锁产生与处理

多个事务之间同时相互争抢锁资源

间隙锁与行锁升级为表锁

  • 间隙锁 当查询数据的时候,查询条件是查的范围而不是制定某个条件(=),锁住查询的范围

# 事务1,其中id=3数据不存在,虽然不存在,但是mysql将该范围的数据进行了上锁操作

select * from member where id between 1 and 8 for update;

# 事务2:此时该事务将阻塞

insert into member(`name`,`content`) values('间隙锁','间隙锁测试');

  • 行锁升级为表锁情况

1: 在不加索引的字段(除主键索引和唯一索引之外)上进行数据的加锁,行锁会升级为表锁情况

2:在加了索引之后加锁的字段会根据普通索引的基础上去进行加锁,而一旦索引失效,就会升级为表锁。

  • 总结尽可能使用索引字段进行加锁尽可能等式而不用范围查询加锁不只是共享锁、排它锁也遵循这样规则

相关推荐

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,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: