MySQL进阶查询篇(6)-锁的种类与应用场景

MySQL是一个常用的关系型数据库管理系统。在多用户并发访问数据库时,为了确保数据的一致性和完整性,MySQL提供了多种锁机制。本文将介绍MySQL数据库中的锁的种类与应用场景。

1.悲观锁(Pessimistic Lock)

悲观锁是在进行数据读取之前就对数据进行加锁。它认为每个事务在读取或修改数据时都会造成数据不一致的情况,所以默认情况下将所有涉及数据的记录都加上锁。悲观锁适用于读取和写入过程时间较长的场景,如复杂的查询和数据修改等。

MySQL中的悲观锁主要有以下两种:

1.1 共享锁(Shared Lock,也称为读锁)

当一个事务对数据加上共享锁后,其他事务只能再加上共享锁,而不能加上排他锁。共享锁适用于读操作,多个事务可以同时读取同一份数据,互不干扰,保证数据的一致性。示例如下:

```sql -- 事务A加共享锁 START TRANSACTION; SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;

-- 事务B也可以加共享锁,不互斥 START TRANSACTION; SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE; ```

1.2 排他锁(Exclusive Lock,也称为写锁)

当一个事务对数据加上排他锁后,其他事务既不能加共享锁也不能加排他锁,只能等待当前事务结束或释放锁。排他锁适用于写操作,保证同时只有一个事务可以修改数据。示例如下:

```sql -- 事务A加排他锁 START TRANSACTION; SELECT * FROM table_name WHERE condition FOR UPDATE;

-- 事务B不能加共享锁或排他锁,只能等待事务A释放锁 ```

2.乐观锁(Optimistic Lock)

乐观锁是在事务提交时对数据进行校验,认为并发事务之间不会有冲突,只有在提交时才检查数据的版本。如果数据版本不一致,说明有其他事务修改了数据,此时需要回滚并重新尝试。乐观锁适用于读操作频繁,写操作较少的场景。

MySQL中的乐观锁一般通过版本号或时间戳来实现,示例如下:

```sql -- 假设表中有version字段 -- 事务A读取数据 START TRANSACTION; SELECT * FROM table_name WHERE condition;

-- 事务B读取数据 START TRANSACTION; SELECT * FROM table_name WHERE condition;

-- 事务A修改数据 UPDATE table_name SET column = value WHERE condition AND version = 1;

-- 事务B修改数据,此时version已经被事务A修改为2,更新失败 UPDATE table_name SET column = value WHERE condition AND version = 1; ```

3.间隙锁(Gap Lock)

间隙锁是在范围查询时锁定数据的空隙。它主要用于防止幻读(Phantom Read)的发生。幻读是指在同一个事务中两次读取同一个范围的数据,但结果发生了变化。间隙锁可以保证范围查询的一致性,避免新的数据插入事务的范围内。示例如下:

```sql -- 事务A加间隙锁 START TRANSACTION; SELECT * FROM table_name WHERE column > value1 AND column < value2 FOR UPDATE;

-- 事务B不能插入与事务A范围重叠的数据 START TRANSACTION; INSERT INTO table_name VALUES (value3);

-- 事务B插入失败,等待事务A释放锁 ```

4.意向锁(Intention Lock)

意向锁是对表或索引上的行级锁之前的锁定,用于协调事务对表或索引的操作,避免死锁。它分为意向共享锁(IS)和意向排他锁(IX)。意向锁是自动加上的,用户不需要显式操作。示例如下:

```sql -- 事务A加行级锁 START TRANSACTION; SELECT * FROM table_name WHERE condition FOR UPDATE;

-- 事务B加意向排他锁 START TRANSACTION; SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;

-- 事务C加意向共享锁 START TRANSACTION; SELECT * FROM table_name WHERE condition FOR UPDATE; ```

以上是MySQL数据库中常见的锁的种类和应用场景。通过合理地选择和使用不同的锁机制,可以有效地保护数据的并发访问,实现数据库的一致性和完整性。根据具体业务的需要,选择适合的锁机制可提高系统性能和用户体验。

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

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

相关文章

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…

Android java基础知识

一.Android java基础知识 第一个java程序Hello Worid&#xff1a; public class Hello {public static void main(String args[]) {System.out.println("Hello, world!");} }运行结果&#xff1a; rootubuntu:/home/topeet/guyilian# javac Hello.java rootubuntu…

使用CICFlowMeter 实现对pcap文件的特征提取【教程】

使用CICFlowMeter 实现对pcap文件的特征提取【教程】 针对现有的关于CICFlowMeter 的使用教程不够全面&#xff0c;一些细节没有展示&#xff0c;我将结合网络上的相关资料和实际的经历&#xff0c;提供一些经验和建议。 configuration information --------------- Windows…

C++入门学习(二十六)for循环

for (初始化; 条件; 递增/递减) { // 代码块 } 打印1~10&#xff1a; #include <iostream> using namespace std; int main() { for (int i 1; i < 10; i) { cout <<i<<endl; } return 0; } 打印九九乘法表&#xff1a; #include <iostream…

Java面向对象 访问控制权限

目录 访问控制权限继承多态组合代理向上转型staticfinal 访问控制权限 访问控制权限⼜称为封装 &#xff0c;它是⾯向对象三⼤特性中的⼀种&#xff0c;我之前在学习过程中经常会忽略封装&#xff0c;⼼想这不就是⼀个访问修饰符么&#xff0c;怎么就是三⼤特性的必要条件了&a…

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…

在Linux系统中设置全局HTTP代理的步骤与技巧

在Linux系统中&#xff0c;设置全局HTTP代理可以方便我们统一管理和控制网络请求。这不仅可以帮助我们加速网络访问&#xff0c;还可以在某些情况下绕过网络限制或实现匿名上网。下面&#xff0c;我将为你详细介绍在Linux系统中设置全局HTTP代理的步骤与技巧。 步骤一&#xf…

windows10安装配置nvm以达到切换nodejs的目的

前言 各种各样的项目&#xff0c;各种node环境&#xff0c;还有node_modules这个庞然大物。。想想都觉得恐怖。 所以现在有了&#xff1a;nvm-切换node环境&#xff0c;pnpm–解决重复下载同样类库的问题。 下面将就如何在win10下配置进行说明 nvm下载配置 nvm的github下载地…

Python DNS操作详解

在网络世界中&#xff0c;DNS&#xff08;Domain Name System&#xff09;扮演着重要的角色&#xff0c;它是一种分布式数据库系统&#xff0c;用于将域名&#xff08;如 google.com&#xff09;转换为相应的 IP 地址&#xff08;如 172.217.7.206&#xff09;。DNS 可以被视为…

【Flink】SQL-CLIENT中出现 Could not find any factory for identifier ‘kafka‘

在Flink的sql-client客户端中执行sql代码时出现如下错误,版本Flink1.13.6 [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier kafka that implements org.apache.flink.table.fa…

nginx: [error] invalid PID number ““ in “/usr/local/nginx/logs/nginx.pid“

问题描述 执行nginx -s reload时&#xff0c;出现如下错误 [rootiZuf65h6i43ltlzhqolumyZ conf]# ../sbin/nginx -s reload nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"解决办法 因为每一个nginx进程都对应一个id&…

配置ARM交叉编译工具的通用步骤

ARM交叉编译工具是用于编译在ARM架构上运行的代码的工具。这些工具允许开发者在一种架构&#xff08;通常是x86或x64&#xff09;上编写和编译代码&#xff0c;然后将其移植到ARM架构上运行。 ARM交叉编译工具链通常包括编译器、链接器、调试器和其他必要的工具&#xff0c;用…

【开源】JAVA+Vue+SpringBoot实现班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

OpenCV 图像处理六(傅里叶变换、模板匹配与霍夫变换)

文章目录 一、傅里叶变换1.1 NumPy实现和逆实现1.1.1 NumPy实现傅里叶变换Demo 1.1.2 NumPy实现逆傅里叶变换Demo 1.2 OpenCV实现和逆实现1.2.1 OpenCV实现傅里叶变换Demo 1.2.2 OpenCV实现逆傅里叶变换Demo 1.3 频域滤波1.3.1低频、高频1.3.2 高通滤波器构造高通滤波器Demo 1.…

JavaScript 涉及模式之外观模式

外观模式 我们为啥要使用外观模式呢&#xff0c;其实我们在使用各种 js 库的时候常常会看到很多的外观者模式&#xff0c;也正是这些库的大量使用&#xff0c;所以使得兼容性更广泛&#xff0c;通过外观者模式来封装多个功能&#xff0c;简化底层操作方法 const A {g: functi…

基金分类

一、按基金运作方式分类 &#xff08;一&#xff09;封闭式基金 是基金份额总额在期限内固定不变&#xff0c;在期限内不可申购和赎回。 &#xff08;二&#xff09;开放式基金 是基金份额总额不固定&#xff0c;在期限内可以申购和赎回。 这里的开放式基金特指传统的开放式基…

Django前后端分离之后端实践

django-admin startproject djweb 生成djweb项目 django-admin startapp news 生成news应用 配置models文件 class NewInfo(models.Model):title models.CharField(max_length30)content models.TextField()b_date models.DateField()read models.IntegerFie…

linux查看当前连接的IP

linux下查询当前所有连接的ip_linux查看某个ip的连接-CSDN博客 netstat -ntu | grep tcp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr

Blazor Wasm Gitee 码云登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

C语言中在main函数之后运行的函数

在 Linux 平台上&#xff0c;atexit 函数同样是一个用于注册终止处理函数的库函数&#xff0c;它是 C 标准库 <stdlib.h> 的一部分。atexit 函数允许你注册一个或多个函数&#xff0c;这些函数会在 main 函数执行结束后&#xff0c;或者在调用 exit 函数时&#xff0c;由…