mysql数据库(九)锁机制

news2024/11/29 6:29:34

锁机制

文章目录

  • 锁机制
  • 一、锁的介绍
    • 1.1锁的分类:
  • 二、死锁现象
    • 2.1 第一张死锁现象
    • 2.2 第二中死锁现象
  • 三、事务隔离机制中的两种数据读取方式

一、锁的介绍

所谓锁就是为了保证数据安全性而设计出来的,举个例子来说就像两人在办公室同时打印文件,为了使打印的内容不混乱,必须等一人打印完以后另一个人才能打印,如果把打印机看出数据,在一个人修改数据时就相当于上了一把锁,另一个人必须等待其修改完成也就是开锁以后才能进行修改操作,这就是锁。

1.1锁的分类:

按颗粒度分,锁可以分为行级锁、表锁和页级锁。行级锁指锁一行数据,表锁会把整个表锁起来,页级锁则是锁一页数据,它介于行级锁与表锁之间。行级锁开销很大加锁速度慢,但是发生死锁冲突的概率较小,并发度最高。在mysql中只有命中索引以后才会加行级锁,如果没命中索引加的锁会把整张表都锁住。如果命中的是主键索引,则会将主键索引锁起来,如果命中的是辅助索引,则会先锁辅助索引,再锁主键索引。innodb中行级锁使用的算法是Next-key lock,它是记录锁和间隙锁的结合,也是这种算法解决了幻读的问题。

按级别分锁可以分为互斥锁和共享锁。互斥锁就是当数据被锁上以后只有自己可以使用,在自己开锁以后其他事务才能再次锁数据。共享锁也就是多个人都可以同时给一个数据上锁,但是只有当数据没有被除自己以外的人锁上时才能对数据进行修改。
在mysql中查询数据属于读操作,增删改属于写操作,执行写操作时默认会加上互斥锁,读操作则不会加上锁(除非你手动加锁)。如果想手动加互斥锁可以使用select … for update,使用共享锁可以使用select … lock in share mode。
另外需要注意的是如果事务A对数据加了共享锁,其他事务就不能对A加互斥锁了,只能加共享锁。但如果其他事务没有加上共享锁的话,事务A仍然可以对数据再加互斥锁。
总结一下就是说:

  • 一旦事务A对数据加了排它锁,那么其他事务无法对数据A加任何锁,且只有事务A可以操作数据(其他事务可以对数据进行不加锁的读操作)。
  • 一旦事务A对数据加了共享锁,那么其他事务只能对数据加共享锁。如果其他事务没有对数据加共享锁,那么事务A可以在对数据加上共享锁的同时加上互斥锁。
  • 一旦多个事务都会数据A了共享锁,大家都只能不加锁的读不能改。

按使用方式分,锁可以分为乐观锁和悲观锁。悲观锁是一种保守的锁定策略,它假设在任何时候,多个线程或进程都可能会尝试修改同一数据项,因此必须在数据被读取时立即锁定,以防止其他线程或进程的修改。乐观锁是一种宽松的锁定策略,它假设多个线程或进程在处理数据时发生冲突的可能性较低,因此不会立即锁定数据,而是在数据提交更新时检查在读取数据后是否有其他线程或进程修改了数据。

二、死锁现象

2.1 第一张死锁现象

#开启两个事务
#事务一
begin;
#事务二
begin;
#事务一
select * from t1 where id=6 for update;
#事务二
update t1 set age=19 where id=2;
#事务一
select * from t1 where id=2 for update;
#由于事务二将id=2的记录锁住了,因此事务一进入死锁状态
#事务二
update t1 set age=19 where id=6;
#由于事务一将id=6的记录锁住了,因此事务二也进入死锁状态
#此时mysql检测到了死锁现象会强制结束事务一,因此事务二完成update操作
commit;

2.2 第二中死锁现象

此种死锁现象发生在高并发状态下。

#假设现在有如下的数据
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | a    |   33 |
|  2 | b    |   22 |
+----+------+------+

现在有两个事务在高并发状态下同时对name和age分别上互斥锁,我们知道innodb存储索引的方式是B+树,而B+树各个节点又是有序排列的,因此可以得到name、age和id三个索引在B+树中的排序大致如下:

name | ‘a’ | ‘b’ |
age | 22 | 33 |
naid | 1 | 2 |
由于A、B两个事务是同时加上的互斥锁,因此name和age两个辅助索引会被A和B分别锁上,然后A、B会开始锁主键索引。A先锁上’a’对应的主键索引1,此时B会锁上22对应的主键索引2,然后A开始锁’b’对应的主键索引2发现B已经上了锁,同时B开始锁33对应的主键索引1发现A已经上了锁,因此死锁现象产生。这种死锁现象非常隐蔽往往很难排查。

三、事务隔离机制中的两种数据读取方式

快照读:在事务中进行不加锁的读操作时,mysql会读取开启事务时快照中的数据。
当前读:在事务中进行任何加锁操作(增删改、加互斥锁读、加共享锁读),mysql会读取数据库中当前的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析下oracle date底层存储方式

之前我们介绍了varchar2和char的数据库底层存储格式,今天我们介绍下date类型的数据存储格式,并通过测试程序快速获取一个日期。 一、环境搭建 1.1,创建表 我们还是创建一个测试表t_code,并插入数据: 1.2,…

【论文复现】SRGAN

1. 项目结构 如何生成文件夹的文件目录呢? 按住shift键,右击你要生成目录的文件夹,选择“在此处打开Powershell窗口” 在命令窗口里输入命令“tree”,按回车。就会显示出目录结构。 ├─.idea │ └─inspectionProfiles ├─benchmark_results ├─data │ ├─test …

Kubernetes 之 Ingress 和 Service 的异同点

1. 概念与作用 1.1 Ingress Ingress 是什么? Ingress主要负责七层负载,将外部 HTTP/HTTPS 请求路由到集群内部的服务。它可以基于域名和路径定义规则,从而将外部请求分配到不同的服务。 ingress作用 提供 基于 HTTP/HTTPS 的路由。 支持 …

结构体详解+代码展示

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

Springboot项目搭建(7)

1.概要 2.Layout主页布局 文件地址&#xff1a;src\views\Layout.vue 2.1 script行为模块 从elementUI中选取图标图案。 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from "element-plus/icons-vue…

cocos creator 3.8 俄罗斯方块Demo 10

这里的表格是横行数列&#xff0c;也就是x是行&#xff0c;y是列&#xff0c;不要当x/y轴看。 1-1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] -1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] 2-1012-1012-1[-1,-1][-1,0]-1[-1,-1][-1…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

LeetCode—74. 搜索二维矩阵(中等)

仅供个人学习使用 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true…

uniapp关闭sourceMap的生成,提高编译、生产打包速度

警告信息&#xff1a;[警告⚠] packageF\components\mpvue-echarts\echarts.min.js 文件体积超过 500KB&#xff0c;已跳过压缩以及 ES6 转 ES5 的处理&#xff0c;手机端使用过大的js库影响性能。 遇到问题&#xff1a;由于微信小程序引入了mpvue-echarts\echarts.min.js&…

房屋出租出售预约系统支持微信小程序+H5+APP

核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 地图找房&#xff1a;通过地图标注查看附近房源&#xff0c;方便用户根据地理位置查找合适的房产。二手房资讯&#xff1a;提供租房及二手房市场的相关资讯&#xff0c;帮助用户了…

Axure农业农村数据可视化大屏模板分享

在当今信息技术飞速发展的时代&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;凭借其高度的自定义能力和丰富的交互设计功能&#xff0c;在农业农村数据可视化领域展现出强大的潜力。本文将详细介绍A…

【分享】PPT打开密码的设置与移除方法

设置和取消PPT的打开密码&#xff0c;是保障和移除文件访问权限的重要操作。以下将分别讲解如何为PPT设置密码&#xff0c;以及如何取消打开密码。 一、如何设置PPT打开密码 方法1&#xff1a; 1、在PowerPoint中打开目标文件&#xff0c;然后点击左上角的“文件”选项。在弹…

网络基础 - 地址篇

一、IP 地址 IP 协议有两个版本&#xff0c;IPv4 和 IPv6IP 地址(IPv4 地址)是一个 4 字节&#xff0c;32 位的正整数&#xff0c;通常使用 “点分十进制” 的字符串进行表示&#xff0c;例如 192.168.0.1&#xff0c;用点分割的每一个数字表示一个字节&#xff0c;范围是 0 ~…

在 Ubuntu 上部署 MediaWiki 开源维基平台

MediaWiki 是一个功能强大的开源维基软件&#xff0c;全球众多组织使用它来创建协作文档网站。本文将指导你如何在 Ubuntu 服务器上安装 MediaWiki&#xff0c;使用 Nginx 作为 Web 服务器&#xff0c;PostgreSQL 作为数据库管理系统。 简介 MediaWiki 是一个灵活且强大的维基…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel&#xff08;没有一次性将数据读取到内存…

Java 基础面试题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…

数据结构2:顺序表

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 1.线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构&#xff0c;也就说…

Java 反射(Reflection)

Java 反射&#xff08;Reflection&#xff09; Java 反射&#xff08;Reflection&#xff09;是一个强大的特性&#xff0c;它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态地操作类的能力&#xff0c;这在很多框架和库中被广泛使用&#…