MySQL:锁

按粒度分类

全局锁

  • 含义:全局锁会锁定整个数据库实例,在其生效期间,其他事务无法对数据库进行任何读写操作。常用于数据迁移、数据备份场景。

表级锁

  • 表锁:是对整张表进行锁定的机制。实现逻辑简单,加锁和释放锁速度快,系统负面影响小,能有效避免死锁问题。不过,因其锁定粒度大,锁定资源争用概率高,会降低并发度。MyISAM、MEMORY、CSV 等非事务性存储引擎主要使用表级锁定。
  • 意向锁:属于表级锁,目的是实现多粒度锁机制,允许行锁和表锁共存。分为意向共享锁(IS)和意向排他锁(IX) 。意向共享锁表明事务后续想获取表中某些行的共享锁;意向排他锁则表示事务后续想获取表中某些行的排他锁。意向锁可快速判断表中是否已有记录被加锁,提升加锁效率。
  • 元数据锁:在执行 DML(增删改查)或 DDL(结构变更)操作时,数据库会自动添加。用于保护数据库对象(如表、视图等)的元数据信息,防止在操作过程中,元数据被其他事务修改,保证数据结构的一致性和稳定性。

行级锁

  • 记录锁:锁定单个数据记录。InnoDB 存储引擎中,若表建立时未设置索引,会使用隐式主键进行锁定。
  • 间隙锁:锁定索引记录之间的 “间隙”,防止其他事务在该间隙插入数据。

image.png

  • 临键锁:是记录锁和间隙锁的组合,既锁定当前行,又锁定该行之后的间隙。
  • 插入意向锁:事务在插入数据时会获取,用于表示插入意向。它与其他事务的插入意向锁兼容,不同事务可并发插入数据到同一索引区间,提高插入操作的并发性能。

按行为分类

共享锁

SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;
  • 含义:也叫读锁,允许事务读取数据,但不允许修改。多个事务可同时获取共享锁。
  • 应用场景:适用于多个事务同时读取同一数据的场景,如报表生成、数据统计等操作,多个事务可同时加共享锁读取数据,互不干扰。

排他锁

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
  • 含义:又称写锁,只允许一个事务对特定数据进行读写操作,其他事务无法对该数据加任何类型的锁。
  • 应用场景:用于数据修改操作,如插入、更新、删除等。在进行这些操作前,需先加排他锁,防止其他事务同时修改数据,保证数据修改的原子性和一致性。

按模式分类

悲观锁

  • 策略:一种假设并发冲突总会发生的策略,每次在访问数据前,都会对数据加锁,包括共享锁、排他锁等。
  • 应用场景:在并发冲突概率较高,或对数据一致性要求极高的场景中适用。例如在金融交易系统中,资金转账操作需确保数据准确一致,常使用悲观锁防止并发问题。

乐观锁

  • 策略:假设并发冲突不会发生,不主动加锁。通常通过版本号或时间戳字段实现。在更新数据时,先比较版本号或时间戳,若数据未被其他事务修改,才进行更新操作。
  • 应用场景:适用于并发冲突概率较低的场景,能减少锁的开销,提高系统并发性能。如一些读操作频繁,写操作相对较少且冲突概率低的系统中可使用。

避免死锁

  1. 确保事务访问数据顺序一致:在多个事务并发访问数据时,通过合理加锁,确保事务按特定顺序访问数据,避免因并发操作导致数据不一致。
  2. 合理使用索引:建立合适索引,能让查询更精准,减少锁的范围,避免因索引不当导致锁升级为表锁,进而降低死锁风险
  3. 控制事务大小:使用较小事务,减少事务执行时间和锁持有时间,降低多个事务互相等待锁的可能性,从而避免死锁。
    . 控制事务大小:使用较小事务,减少事务执行时间和锁持有时间,降低多个事务互相等待锁的可能性,从而避免死锁。
  4. 设置锁等待超时时间:通过设置合理的锁等待超时时间,当事务等待锁时间超过该值时自动回滚,打破死锁循环,防止因死锁导致系统长时间无法运行。在 MySQL 中,可通过相关参数配置来设置锁等待超时时间。

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

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

相关文章

数字政府政务服务领域智能化应用解决方案

数字政府政务服务领域智能化应用 解决方案 一、方案背景 在数字经济蓬勃发展的当下,数字化转型已成为政府提升治理能力、优化公共服务、增强竞争力的关键路径。党的十九届四中全会明确提出 “推进数字政府建设”,这为政府的数字化转型指明了方向。 随…

03--Deepseek服务器部署与cjson解析

一、ollama部署deepseek模型 1、Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。 Ollama 教程:从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客 1.下载o…

栈(算法)

在 C 里,栈是一种遵循后进先出(LIFO)原则的数据结构。下面从多个方面为你介绍 C 栈: 1. 使用标准库中的std::stack C 标准库提供了std::stack容器适配器,能方便地实现栈的功能。以下是简单示例: cpp #in…

UniApp 页面布局自定义头部导航

动态计算头部高度与内容偏移量:实现 UniApp 页面布局的精准适配 在移动端应用开发中,页面布局的精准适配是一个关键问题。尤其是在 UniApp 中,不同设备的屏幕尺寸、状态栏高度以及头部布局的差异,可能导致页面内容错位或显示不全…

verilog学习--1、语言要素

先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B; endmodule; Verilog以module为单位编写,每个文件一个module&#…

AC 自动机 洛谷P3808 P3796 P5357

洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们&#xff01;今天我们来一起学习算法和贪心思维&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 第1题 数位排序 对于这道题&#xff0c;我们需要自己写一个排序算法&#xff0c;也就是自定义排序&#xff0c;按照数位从小到大进行排序。 举一…

redisson常用加锁方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下&…

Go 微服务框架 | 路由实现

文章目录 不用框架实现web接口实现简单的路由实现分组路由支持不同的请求方式支持同一个路径的不同请求方式前缀树应用前缀树完善路由代码 不用框架实现web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通过模板实现自动发现对tcp端口批量监控

主要为了解决监控大量端口&#xff0c;避免繁琐的重复操作监控项和触发器 诸位~ 仅供参考哈 自动发现监控参考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先创建一个模板 自定义名称和群组 创建自动发现规则 模板——自动发现——创建发现规则…

Mysql备忘记录

1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…

X 进制减法

题目链接&#xff1a; 思路&#xff1a; X进制数321怎么转换为十进制数为65&#xff1f;如下图&#xff1a; ①题目要求我们求 A - B 的最小值&#xff0c;对第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;当进制越小的时候差值越小&#xff0c;但进制要比 max&…

java线程安全-单例模式-线程通信

首先看看单例模式的写法 首先我们先来回顾一下饿汉式单例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

大数据技术之SPARK

Spark Core 什么是 RDD 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性&#xff1a;内存与磁盘的自动切换&#xff1b; 容错的弹性&#xff1a;数据丢失可以自动恢复&#xff1b; 计算的弹性&#xff1a;…

Go 语言范围 (Range)

Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言&#xff0c;由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中&#xff0c;range 是一个非常有用的关键字&#xff0c;用于遍历数组、切片、字符串以及通道&#xff08;channe…

VUE中数据绑定之OptionAPI

<template> <div> 姓名:<input v-model="userName" /> {{ userName }} <br /> 薪水:<input type="number" v-model="salary" /> <br /> <button v-on:click="submit">提交</button>…

react动态路由

框架的权限控制&#xff08;在config.ts中配置&#xff09; export default {access: {}, }; 权限配置文件&#xff08;access.ts&#xff09; 新建 src/access.ts &#xff0c;在该文件中 export default 一个函数&#xff0c;定义用户拥有的权限 该文件需要返回一个 functi…

Android里面如何优化xml布局

在 Android 开发中&#xff0c;以下是系统化的优化方案&#xff0c;从基础到高级分层解析&#xff1a; 一、基础优化策略 1. 减少布局层级 问题&#xff1a;每增加一层布局&#xff0c;测量/布局时间增加 1-2ms 解决方案&#xff1a; <!-- 避免嵌套 --> <LinearLayo…

基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计

一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…