【1. MySQL锁机制】

news/2024/5/11 10:44:04/文章来源:https://blog.csdn.net/weixin_45043334/article/details/127704550

文章目录

    • 共享锁(读锁也叫S锁)/排他锁(写锁也叫X锁)
    • 行锁
    • 表锁
    • 意向锁
    • 间隙锁
    • 乐观锁
    • 悲观锁

共享锁(读锁也叫S锁)/排他锁(写锁也叫X锁)

  • 共享锁(S锁):当一个事务给一条记录上共享锁后,其他的事务也可以对该事务上共享锁,但是该锁只是可以读,如果有事务想写,那么它就会阻塞,一直等待所有的锁释放。
  • 排他锁(X锁):当一个事务给记录上锁后,可以进行读写,其他的事务不能够上任何锁。

行锁

  • innodb既支持行锁,也支持表锁
  • 行锁开销大,会出现死锁,发生冲突几率小,并发高
  • MySQL的行锁是通过索引加载的,锁住的永远是索引,而非记录本身,即使没有索引innodb会在后台创建一个聚簇索引,行锁就会锁住聚簇索引,但是如果一个SQL语句没有走任何索引,那么就会为它加上表锁,全表扫描。

表锁

  • 针对数据库的表进行加锁。不会出现死锁,发生锁的冲突几率高,并发低。
  • MySQL表锁有俩个模式:表共享读锁和表独占写锁
  • 表级自增锁,当为表的某一列添加AUTO_INCREAMENT属性后,插入数据可以不指定该字段,系统会自动为它赋值。此时获取自增值是需要AUTO_INC锁锁定的
  • MyISANM不适合做写为主表的引擎,因为它是表锁,当锁住后,其他的线程不能做任何操作,从而大量更新会使得查询很难得到锁,最终导致永久阻塞。

意向锁

如果出现行锁的时候,想加表锁,那就只能进行全表遍历,看是否有加行锁。太浪费时间

  • 意向锁是则不需要进行遍历数据也可以直接判断是否可以给表加锁
    • 意向共享锁(IS锁):当事务给某行记录增加了S锁(共享锁),同时给表加一个IS锁
    • 意向独占锁(IX锁):当事务给某条记录增加X锁时(独占锁),同时给表加一个IX锁。
  • 意向锁是innodb自动加的,不用用户干预。

间隙锁

MySQL默认隔离级别是可重复读,而可重读读只能解决脏读,不可重复读。解决不了幻读,但是不同的一点是MySQL通过俩种机制来解决幻读:一靠MVCC方案解决,二加锁方案解决。然而事务加锁时,记录是不存在的,是无法加行锁,则需要靠间隙锁。
在这里插入图片描述

  • 例如给 id=8 记录加 gap 锁,锁住(4,8)区间。另一事务想插入 id=6 的记录,会先定位到 id=8 的记录,然后发现存在一个 gap 锁,则阻塞直到 第一个事务将 gap 锁释放掉,才可以在(4,8)区间插入记录
  • gap lock 仅仅是为了防止插入幻影记录,并不会限制其他事务对记录继续加行锁 或者 gap 锁

乐观锁

  • 每次拿数据都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。

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

  • MVCC (Multiversion Concurrency Control),即多版本并发控制技术。

  • MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁

总结

  • MVCC其本质就是看做是乐观锁的机制,而排他锁等则是悲观锁的实现。

悲观锁

  • 每次拿数据时都认为别人会修改,所以每次那数据时都会上锁,别人拿数据时会阻塞直到拿到锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_412027.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】搜索二叉树(C++实现)

目录 一、二叉搜索树的概念 二、二叉搜索树的实现 2.1 节点的定义及构造 2.2 树的结构及功能展示 2.3 树的 Insert 2.4 树的中序遍历 2.4 树的 Find 2.5 树的 Erase 2.6 拷贝构造、赋值运算符重载、析构函数 三、递归实现树的增删查 3.1 递归实现 FindR 3.2 递归实…

Linux开发工具

目录 一、yum工具 1.yum 背景知识 (1)商业生态 (2)开源生态 (3)软件生态本土化 2.yum 的基本使用 (1)查看软件包 (2)软件包名称构成 (3&a…

高级架构师_Redis_第2章_数据类型与底层数据结构

高级架构师_Redis_第2章_数据类型与底层数据结构 文章目录高级架构师_Redis_第2章_数据类型与底层数据结构第二章:数据类型与底层数据结构本章学习目标:第一节:Redis 数据类型选择和应用场景1.1 Redis 的 Key 的设计1.2 String 字符串类型1.3…

SpringSecurity Oauth2实战 - 04 自定义AuthProvider实现登录认证

文章目录1. 搭建资源服务器1. Token存储配置类 TokenStoreAutoConfiguration2. 资源服务器配置类 ResourceServerAutoConfiguration3. 在META-INF/spring.factories文件下添加配置类2. 搭建授权服务器1. 密码加密配置类 PasswordEncodeConfig2. RestTemplateConfig3. 授权服务器…

SQL学习笔记(未完待续)

鉴于自己最近在做后端开发的工作时,发现自己的SQL能力实在太差,开始学习SQL语句基础,学习过程中在本博客进行笔记记录,课程参考:https://www.bilibili.com/video/BV1UE41147KC?p2 基本概念 DBMS: 数据库管理系统&am…

基于Python实现的文章整合搜索引擎网站(Scrapy+Django+MySQL)

目 录 摘 要… 1 1 概述… 6 2 技术选型… 6 2.1 Scrapy-Redis 分布式爬虫 … 6 2.1.1 Redis… 6 2.1.2 Scrapy… 7 2.2 MySQL 数据存储 … 8 2.3 Django 搭建搜索网站 … 8 2.4 ElasticSearch 搜索引擎 … 9 2.4.1 Elasticsearch-RTF… 9 2.4.2 Elasticsearch-head… 10 2.4.3…

Kotlin编程实战——集合(07)

一 概述 集合概述构造集合迭代器(Iterable<T>)区间与数列序列(Sequence<T>)集合操作概述集合转换集合过滤加减操作符分组(groupBy())取集合的一部分取单个元素集合排序集合聚合操作集合写操作List 相关操作Set 相关操作Map 相关操作 二 集合概述 set、list 、map…

【python】Numpy统计函数总结

文章目录函数列表相关系数直方图函数列表 最值amin, amax, nanmin, nanmax, 极差ptp分位数percentile∗^*∗ quantile∗^*∗,统计量中位数median∗^*∗&#xff1b;平均数mean∗^*∗&#xff1b;变化幅度var&#xff1b;加权平均average标准差std&#xff1b;协方差cov&#x…

运算放大器正反馈负反馈判别法

---------------------------------------------------------------------------------------------------------------- 反馈可分为负反馈和正反馈。前者使输出起到与输入相反的作用&#xff0c;使系统输出与系统目标的误差减小&#xff0c;系统趋于稳定&#xff1b;后者使输出…

浅谈java中的String

Java中的String类型不属于八大基本数据类型&#xff0c;而是一个引用数据类型&#xff0c;所以在定义一个String对象的时候如果不直接赋值给这个对象&#xff0c;它的默认值就是null。我们要怎么理解String类型的不可变&#xff0c;在JDK源码中String这个类的value方法被final关…

【C++】如何修改set的值

问题&#xff1a;尝试通过begin方法得到的迭代器去修改值&#xff0c;发现会报错。 set<string> st{"hello", "world", "good"}; set<string>::iterator it st.begin(); *it "test"; 原因&#xff1a;我们可以在源码里…

怎么搭建搜题接口api

怎么搭建搜题接口api 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

RTSP协议学习Ubuntu环境准备

文章目录RTSP协议学习Ubuntu环境准备RTSP协议概述Ubuntu环境准备一、Ubuntu安装FFmpeg二、安装ZLMediaKit1、获取代码2、强烈推荐3、编译器3.1、编译器版本要求3.2、安装编译器4、cmake5、依赖库5.1、依赖库列表5.2、安装依赖库6、构建和编译项目7、运行8、测试三、测试推流测试…

【Tomcat】解决Tomcat服务器乱码问题

俩地方开展出现乱码的原因1、以startup.bat文件打开的服务器出现乱码2、在IDEA中运行Tomcat服务器出现乱码问题3、有关社区版IDEA如何开发JavaWeb项目出现乱码的原因 使用了错误的字符编码去解码字节流&#xff0c;所以出现乱码咱思维要清晰&#xff0c;就去找字符编码是否与其…

【TS04——接口的多态——泛型接口】

接口的多态&#xff0c;同一个方法&#xff0c;传入不同的参数&#xff0c;他所对应的操作不同成为多态【参数不同】或者可以理解为同一个方法&#xff0c;返回不同的结果&#xff0c;称之多态。 interface IfnPerson {run():voidrun(id:number):voidrun(id:number,name:strin…

【生日快乐】Node.js 实战 第1章 欢迎进入Node.js 的世界 1.3 安装Node

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.3 安装Node第1章 欢迎进入Node.js 的世界 1.3 安装Node 安装Node的最简单的方法是使用其官网上的安装程序。可以用对应Mac或 Windows的安装程序安装最新的当前版。 官网安装包下载地址&#xff1a;https://…

Jenkins部署详细教程

Jenkins简介 Jenkins 是一个可扩展的持续集成引擎。是一个自成一体的开源自动化服务器, 可用于自动化与构建、测试、交付或部署软件相关的各种任务; Jenkins是一个高度可扩展的产品, 其功能可以通过安装插件来扩展。 在gitlab里可以完成源代码的管理&#xff0c;但是对于研发…

[ACTF2020 新生赛]Exec1命令注入

1.来看题目如下 得到一个ping的输入框&#xff0c;老样子先检查网页源码看有没有什么好东西&#xff0c;得到一个链接&#xff0c;我们来访问一下 发现也没什么有用处的信息&#xff0c;于是看到题目的标题之后联想到了命令注入&#xff0c; 那么是怎么判断使用命令注入的呢&am…

MyBatis初步了解

1.Mybatis简介 1.1原始jdbc操作&#xff08;查询数据&#xff09; 1.2原始jdbc操作&#xff08;插入数据&#xff09; 1.3 原始jdbc操作的分析 原始jdbc开发存在的问题如下&#xff1a; ①数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能 ②sql 语句在代码中硬编…

深入理解Java虚拟机:Java运行内存结构

本篇内容包括&#xff1a;JAVA 运行内存结构&#xff0c;即 程序计数器、Java 虚拟机栈、本地方法栈 、Java堆、方法区、运行时常量池 以及 直接内存等相关内容&#xff01; 一、JAVA 运行内存结构 Jvm 执行 Java 程序时&#xff0c;会把它所管理的内存划分为若干个不同的数据…