MySQL的锁

news2024/10/9 18:25:06

把那些可能会被多个线程同时操作的资源称为临界资源,加锁的目的就是让这些临界资源在同一时刻只能有一个线程可以访问。数据库作为用户共享的一个资源,如何保证数据并发访问一致性也是所有数据库必须解决的问题,如何加锁是数据库并发访问性能的一个重要因素。

关于数据库中的锁

从对数据库操作的类型可将锁分为读锁(共享锁)和写锁(排他锁):

读锁:多个读操作可以同时进行不会互相影响;

写锁:当前写操作没有完成前,会排斥其他的读锁和写锁。

从数据操作粒度上可以分为表锁行锁

表锁
顾名思义,表锁就是锁住整张表。这种操作开销小,加锁快,不会出现死锁,但是锁的粒度大,并发度低。MyISAM 引擎在操作数据时就会自动给数据加上表锁。

首先创建一个数据库和一张表:

create database test_mysql;
use test_mysql;
create table test_mysql_lock(
 `id` INT(20) NOT NULL AUTO_INCREMENT,
 `name` VARCHAR(40) DEFAULT NULL,
 primary key(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into test_mysql_lock values(1,'javayz');
insert into test_mysql_lock values(2,'javayz2');

可以通过下面 sql 手动增加表锁,其中 read 和 write 是两种锁类型:

lock table 表名 read(write);

查看表上加过的锁:

show open tables;

在这里插入图片描述删除锁:

unlock tables;

加了读锁后,将限制写入;加了写锁之后,将限制读和写;

行锁

行锁就是锁住一行数据,这种做法开销大,加锁慢,会出现死锁。但是锁的粒度小,并发度最高。InnoDB 支持行锁,同时 InnoDB 还支持事务。

通过一个简单的例子来介绍一下行锁,开启两个 session(在控制台中创建两个终端)去操作数据库,其中在第一个查询中修改数据,但是不提交:

begin;
update test_mysql_lock set name='javayz2' where id=1;

这个时候用另外一个查询窗口去修改同一行数据:

update test_mysql_lock set name='javayz2' where id=1;

这行更新语句会被一直阻塞,现在把第一个查询中修改的数据提交:

commit;

第二个查询中的修改也立刻生效了,查看结果,阻塞了 11 秒:
在这里插入图片描述
注意:InnoDB 的行锁是加在索引上的,如果索引失效或者修改的是非索引字段,行锁就会升级为表锁。

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

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

相关文章

字节前端高频手写面试题(持续更新中)

Promise // 模拟实现Promise // Promise利用三大手段解决回调地狱: // 1. 回调函数延迟绑定 // 2. 返回值穿透 // 3. 错误冒泡// 定义三种状态 const PENDING PENDING; // 进行中 const FULFILLED FULFILLED; // 已成功 const REJECTED REJECTED; // 已…

Vite构建工具

什么是构建工具:打包:将我们写的浏览器不认识的代码交给构建工具进行编译处理的过程就叫做打包,打包完成以后会给我们一个浏览器可以认识的文件 一个构建工具他到底承担了哪些脏活累活: 1. 模块化开发支持:支持直接从node_modules里引入代码&#xff0b…

十三、Kubernetes yaml资源清单详解

1、概述 kubectl提供了各种命令,来管理集群中的pod,但是这些命令都是为了方便运维测试,实际生产部署还得用yaml文件来部署,所以弄清楚各类资源的字段是非常重要的。 资源清单就是k8s当中用来定义pod的文件,语法格式遵…

C#语言实例源码系列-实现ID卡的识别

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

Vlan的原理与配置

传统以太网的问题 规模大了,之后导致性能也很差,广播会增加 解决:用Vlan,不受地域限制,同一Vlan内的设备才能直接进行二层通信 实验 首先配置以上vlan与电脑ip 配置IP之后可以进行ping命令测试刚开始是连通的&#x…

计算机视觉实战----AlexNet网络及使用colab跑YoloV5代码

系列文章目录 文章目录系列文章目录前言一、用colab薅羊毛二、使用百度飞浆操作三、二、使用步骤1.引入库2.读入数据总结前言 一、用colab薅羊毛 Colaboratory 简称“Colab”,是 Google Research 团队开发的一款产品。在 Colab 中,任何人都可以通过浏览…

分享107个PHP源码,总有一款适合您

链接:https://pan.baidu.com/s/1Su77mBUx87vk0lzSLyvnyw?pwdyo96 提取码:yo96 PHP源码 分享107个PHP源码,总有一款适合您 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https://down.c…

基于 Spring Boot 的 RESTful API 设计与实现

RESTful 是一种规范,符合 RESTful 的 Api 就是 RESTful Api。简单的说就是可联网设备利用 HTTP 协议通过 GET、POST、DELETE、PUT、PATCH 来操作具有 URI 标识的服务器资源,返回统一格式的资源信息,包括 JSON、XML、CSV、ProtoBuf、其他格式。…

OpenVINS 官方文档 第一部分

参考链接:OpenVINS https://docs.openvins.com/index.html 1. Getting Started 欢迎来到OpenVIINS项目!以下指南将帮助新用户下载软件并在我们支持的数据集上运行。此外,我们还提供有关如何在我们的系统上运行您自己的传感器的信息&#xff0…

《500强高管谈VE价值工程》-对经营变革期下VE的期待

文章出处:日本VE协会杂志 文章翻译:泰泽项目部 关注泰泽:实现高利润企业 《500强高管谈VE价值工程》-对经营变革期下VE的期待 作者: 鹿岛建设常务董事小野馨喜 随着21世纪的到来,社会结构和经济环境正在发生重大转变&…

MobPush 创建推送

功能说明 MobPush提供遵循REST规范的HTTP接口,适用各开发语言环境调用。 IP绑定 工作台可以绑定服务器IP地址,未绑定之前所有IP均可进行REST API的调用,绑定后进仅绑定的IP才有调用权限。 调用地址 POSThttp://api.push.mob.com/v3/push/c…

东南亚开年大促必爆商品;2023Lazada家居家饰需求品类来袭

为持续提升商家体验,保障经营效率,2023年Lazada平台将调整Birthday sale生日大促的活动时间节奏 2023年6个国家站点(印尼、马来西亚、菲律宾、新加坡、泰国、越南)均会将生日大促提前至2023年3月3日开始。 家居家饰需求清单&…

什么是快速排序?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 JdreamZhang 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法&#xff0…

华为云工程师HCIA——桌面云解决方案概述

一、桌面云解决方案概述 瘦终端和胖终端 瘦终端:提供屏幕,和很小的计算能力胖终端:提供主要计算能力 桌面云架构VDI与IDV 华为桌面云解决方案逻辑架构 FusionCompute云平台架构 桌面云的优势 二、桌面云组件介绍 接入和访问控制层 WI&…

图像处理(2)——图像特征提取LBP

图像处理(2)——图像特征提取LBP 其实现在大家都说图像处理,其实计算机是不认识图片的,之所以可以处理图像,其实图像就是一个个矩阵,其实是数字,转而其实都是在处理数字。深度学习在图像上的建…

数字图像处理实验——数字图像处理初步

一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式的图像; 2.熟练掌握在MATLAB中如何读取图像及图像的属性信息(大小、颜色、亮度(灰度)、宽度、高度等); 3.掌握如何在MATLAB中按照指定要求存储一…

Windows 内核安全编程技术实践

《Windows 内核安全编程技术实践》,这是一本Windows 10内核安全开发系列丛书,探索 AntiRootKit 反内核工具核心原理与技术实现细节,揭开ARK工具的神秘面纱,本书以实战角度出发摒弃了大量无用的专业术语,欢迎阅读并提出…

在Qt中设置窗体背景颜色及透明度的方法介绍

本文主要介绍在 Qt 中设置窗体背景颜色及透明度的方法。 说明: 本文中的应用程序是面向 Windows 操作系统的;本文中使用的 Qt Creator 版本号为:7.0.0;本文中使用的 Qt 版本号为:5.14.2。 1 利用样式表(S…

Github每日精选(第82期):还在用logging试试loguru

Loguru 如果你还在使用logging,不妨花点时间来看看Loguru,Loguru是一个Python日志记录的库。 您是否曾懒于配置记录器而使用print()?。。。 我确实这样做了,但日志记录对于每个应用程序来说都是基本的&a…

Redis集群系列十二 —— 故障转移二

场景 模拟集群中有一个 master 宕机场景。 故障转移自动故障转移和手动故障转移。 自动故障转移 打开日志监控 为了更好折查看效果,通过 watch 命令实时查看集群的动态日志变化,如图: watch redis-cli -p 30001 cluster nodes 注意&#…