1. 什么是表锁?什么是行锁?什么情况下会使用表锁?

InnoDB引擎通过“索引”实现行锁(锁定满足条件的行),但如果操作无法通过索引定位行,会导致行锁失效,进而升级为表锁。常见的表现为:

(1)条件中未使用索引,InnoDB 无法定位具体行,会锁整个表;

(2)使用非索引列的范围查询,范围查询无法通过索引锁定行,触发表锁;

(3)索引失效(如函数 / 类型转换),索引失效后无法定位行,触发表锁;

(4)更新全表的操作,因需更新所有行,行锁效率低于表锁。

InnoDB 使用表锁的核心场景可分为 “主动使用” 和 “被动退化” 两类,本质是当 “行锁无法高效实现” 或 “表锁成本更低” 时的选择:

(1)主动使用表锁的场景(显式或隐式):场景 1:无索引 / 索引失效导致的全表扫描更新、场景 2:执行 LOCK TABLES 显式锁表、场景 3:DDL 操作(数据定义语言):所有 DDL 操作(如 ALTER TABLEDROP TABLECREATE INDEX 等)会自动加 表级排他锁,防止 DDL 过程中表数据被修改导致结构不一致。

(2)被动退化到表锁的场景:这类场景是 InnoDB 尝试加行锁失败后,被迫升级为表锁:场景:行锁冲突过于频繁,触发 “锁升级”:InnoDB 虽然支持行锁,但每个行锁的维护(如锁结构存储、冲突检查)需要消耗内存。当一个事务需要锁定 极多的行(如锁定数万行),且行锁冲突频繁时,MySQL 可能会触发 锁升级(Lock Escalation)—— 将大量行锁合并为一个表锁,减少内存消耗和冲突检查成本。

2. 责任链设计模式?策略模式?模板方法模式?

先明确三者的 “本质定位”—— 不同模式解决的核心问题完全不同:

  • 模板方法模式:解决 “步骤固定但细节可变” 的问题(定义流程骨架,留空细节);

  • 策略模式:解决 “多种算法 / 行为可选” 的问题(封装不同实现,动态切换);

  • 责任链模式:解决 “多个对象依次处理请求” 的问题(请求传递,直到被处理)。

使用场景:

模板方法模式:适合 “流程固定,细节可变” 的场景;

策略模式:适合 “多种算法可选,需动态切换” 的场景;

责任链模式:适合 “请求需多步处理,且处理者不确定” 的场景。

(1)责任链模式

核心是 “将多个处理器(Handler)连成一条链,请求沿着链传递,使用多个节点来处理它”。它的存在主要是为了解决三类核心问题:①解耦 “请求发送者” 与 “请求处理者”:传统写法中,发送者需要知道哪个处理器能处理请求,比如说使用if-else来判断,一旦处理器增减或逻辑变化,发送者代码必须修改。责任链模式中,发送者只需将请求 “丢给链的头部”,无需关心链上有多少处理器、谁来处理 —— 处理器的增减 / 顺序调整,完全不影响发送者。②支持 “动态组合处理流程”:责任链的处理器可以动态添加、删除或调整顺序,灵活适配不同场景。③避免 “if-else/switch” 的代码臃肿:当处理逻辑有多个分支且可能扩展时,if-else会导致代码冗长、可读性差,责任链用 “对象链” 替代分支判断,代码更符合单一职责原则(每个处理器只处理自己负责的逻辑)。

(2)模板方法模式

核心定义:定义一个固定的流程骨架(父类),将流程中 “可变的步骤” 延迟到子类实现,确保流程的一致性,同时允许细节灵活调整。
核心思想:“骨架不可变,细节可变”,是一种 “父类定规矩,子类填内容” 的模式。

(3)策略模式

核心定义:将多种可替换的算法 / 行为封装成独立的 “策略类”,使算法与使用算法的 “上下文” 解耦,上下文可动态切换不同策略(无需修改原有代码)。
核心思想:“算法家族化,切换动态化”,是一种 “选择不同实现” 的模式。

3. MySQL中有哪些事务隔离级别?

读未提交、读已提交、可重复读、串行化。

(1)读已提交如何解决脏读?

脏读:一个事务读取到另一个事务未提交的修改(可能被回滚的数据)。

RC 级别通过 **“只读取已提交的数据”** 解决脏读,核心机制是:

  • 每次读取都获取最新的已提交版本:事务中每次执行SELECT时,都会去读取其他事务已经提交的数据版本,忽略未提交的修改。

  • 实现方式:依赖 MySQL 的多版本并发控制(MVCC)。每个事务修改数据时,会生成一个新的数据版本,并标记版本号(与事务 ID 关联)。RC 级别下,查询只会看到 “版本号小于当前事务 ID 且已提交” 的数据,因此不会读取到未提交的脏数据。

(2)可重复读如何解决脏读和不可重复读?

1. 解决脏读的机制:与 读已提交 级别类似,可重复读 也通过 MVCC 保证 “只读取已提交的数据”,但对 “已提交版本” 的判断更严格:

  • 事务启动时会生成一个一致性快照(基于当时的全局事务 ID),整个事务内的所有SELECT都读取这个快照中的数据。

  • 快照中只包含 “在事务启动前已提交的版本”,完全忽略事务启动后其他事务的未提交修改,因此不会出现脏读。

2. 解决不可重复读的机制:可重复读 通过 **“事务内读取一致性快照”** 解决不可重复读:

  • 事务启动时生成的快照会被整个事务复用,无论其他事务是否提交新的修改,本事务内的SELECT始终读取快照中的旧版本,确保多次读取结果一致。

(3)可重复读如何解决幻读?

幻读:同一事务内两次范围查询,结果因其他事务插入新数据而增多(“幻觉” 出新行)。

MySQL 的 InnoDB 引擎在 可重复读 级别通过 **“MVCC 快照读 + 间隙锁当前读”** 组合解决幻读:

  1. 快照读(普通SELECT
    依赖一致性快照,事务内两次范围查询都读取快照数据,其他事务插入的新数据不在快照中,因此不会看到 “新增的行”。

  2. 当前读(加锁查询 / 写操作,如SELECT ... FOR UPDATEINSERT
    通过间隙锁(Gap Lock) 锁定 “可能插入新数据的区间”,阻止其他事务在该区间插入数据,从源头避免新行产生。

4. 布隆过滤器

布隆过滤器的核心作用是快速判断一个元素 “是否可能存在”,存在一定的 “误判率”(但不会漏判)。

原理:通过多个哈希函数将元素映射到一个位数组的多个 bit 位,标记为 1;查询时,若所有对应 bit 位都是 1,则 “可能存在”,否则 “一定不存在。

特点:优势:空间效率极高(用 bit 存储)、查询速度快(O (k),k 为哈希函数数量);局限:有误判率(可能把不存在的元素判为 “可能存在”),且不支持删除操作(删除会影响其他元素)。

典型使用场景:缓存穿透防护:在缓存前加一层布隆过滤器,提前过滤掉 “一定不存在的 key”,避免请求穿透到数据库(如恶意查询不存在的 ID);海量数据去重:如爬虫 URL 去重(判断 URL 是否已爬取)、邮件黑名单过滤等。

5. BitMap实现签到

(1)Key 的设计
用于唯一标识用户的签到记录,通常采用 “业务前缀:用户 ID: 时间维度” 的结构化命名,例如:user:sign:1001:2024(用户 ID=1001 在 2024 年的签到记录)
时间维度根据业务需求选择(年 / 月 / 日),推荐按 “月” 拆分,避免单 Bitmap 过大。

(2)Value 的设计
Bitmap 的 value 是一个 二进制数组(bit 序列),每个 bit 位对应一天的签到状态:1 表示该天已签到,0 表示未签到。位的索引(offset)对应 “当月的第几天”(通常从 0 开始,如 0 代表 1 号,1 代表 2 号,以此类推)。

(3)具体实现

①签到操作(记录签到状态):逻辑:用户签到时,将对应日期的 bit 位设为 1。命令SETBIT key offset 1;

②统计签到情况:检查某天是否签到:GETBIT key offset → 返回 1 表示签到,0 表示未签到。

③统计当月签到总次数:BITCOUNT key → 统计 bitmap 中 1 的总数。

④计算连续签到天数:从当天 offset 往前遍历,找到第一个 0 的位置,当前 offset 与该位置的差值即为连续天数。

⑤查找当月签到的所有日期:遍历 bitmap 所有 bit 位,记录值为 1 的 offset,再转换为具体日期。

(4)优势

  • 极致省内存:1 个月(30 天)的签到记录仅需 30 bit(约 4 字节),1000 万用户存储 1 年也仅需约 45MB。

  • 操作高效:基于位运算,签到和统计的时间复杂度均为 O (1) 或 O (n)(n 为天数,通常很小)。

(5)注意事项

时间维度拆分:避免按年存储(365 天)导致单 bitmap 过大,推荐按月拆分(最多 31 位)。

offset 计算:需确保日期与 offset 正确映射(如 1 号对应 0,2 号对应 1),避免错位。

过期清理:对于过期的签到记录(如去年的月度数据),可通过 EXPIRE 设置过期时间自动清理。

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

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

相关文章

达梦数据库-用户,权限,角色

达梦数据库-用户,权限,角色 在达梦数据库(DM8)中,用户(User)、权限(Privilege)和角色(Role) 是数据库安全体系的核心组成部分,用于控制谁可以访问数据库、能访问哪些对象以及能执行哪些操作。 下面为你提供一份全面、详细、结构化的说明,帮助你深入理解达梦数据…

uniapp原生插件 TCP Socket 使用文档

uniapp原生插件 TCP Socket 使用文档 试了插件市场几个TCP Socket插件都不能实现监听服务器主动断开,于是闲来无事就开发了一款,本插件是一个基于 Netty 实现的 TCP 通信模块,用于在 UniApp 插件中提供 TCP 连接、数据发送和连接管理功能。以…

VM中CentOS 7密码重置

重启虚拟机点击e进入内核处理向下划找到UTF-8在后面输入rd.breakctrl X进入单用户模式mount -o remount,rw/sysroot进行挂盘 chroot /sysroot访问系统,并使用passwd修改root密码 出现乱码 输入LANGen touch /.autorelabel 保存配置 exit exit退出等待系统重新打开&…

车规级MOS管AEC-Q101认证的关键参数解读与失效模式-深圳阿赛姆

摘要本文拆解AEC-Q101认证的7大关键测试项(UIS/温度循环/THB等),结合M120N06JC等型号实测数据,解析雪崩失效/栅氧击穿/绑定线脱落等故障机理,附选型核查表一、AEC-Q101认证核心测试项与参数解读1.1 非钳位电感开关测试…

嵌入式铁头山羊stm32-ADC实现软件触发的常规序列的单通道转换-Day25

目录 一、实验目的 二、电路连接 三、实验执行(五步) 1.初始化ADC的IO引脚 2.配置ADC的时钟,注意要小于14MHz 3.根据ADC的编程接口 实现初始化ADC的基本参数 4.配置常规序列并闭合触发输入开关 5.闭合总开关、启动并读取转换结果 四…

多模态模型出现“幻觉”,描述了表格中不存在的内容,如何修正?

在日常工作中,多模态模型的 “幻觉” 问题已成为影响效率的关键痛点 —— 当我们需要模型基于文档生成建议性内容(如行业报告分析、论文数据解读等)时,模型常因无法准确理解文档信息,输出包含 “虚构内容” 的结果&…

Java AI 智能问数:Function调用版如何重塑企业数据决策

Java AI 智能问数:Function调用版如何重塑企业数据决策 在数字化转型浪潮中,企业一把手常面临数据查询的痛点:分析师需编写复杂SQL,业务人员依赖IT支持,决策链条冗长。传统方法效率低下,而自然语言处理&…

AI-调查研究-74-具身智能 机器人学习新突破:元学习与仿真到现实迁移的挑战与机遇

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的…

劳务员的就业前景如何?

劳务员的就业前景整体较为乐观,受到行业需求、政策支持等因素的积极影响,同时也面临着一些挑战。以下是具体分析:1.就业优势行业需求稳定:建筑行业作为国民经济的支柱产业,持续发展使得对劳务员的需求较为稳定。无论是…

libvirt 新手指南:从零开始掌握虚拟化管理

引言 在云计算、大数据和边缘计算的时代,虚拟化技术已成为 IT 基础设施的核心支柱。它允许我们在单一物理服务器上运行多个虚拟机(Virtual Machine,简称 VM),从而实现资源的高效利用、快速部署和灵活扩展。对于新手来说…

OpenLayers数据源集成 -- 章节三:矢量要素图层详解

前言在前面的文章中,我们学习了OpenLayers的瓦片图层(TileLayer)技术。本文将深入探讨OpenLayers中的矢量要素图层(VectorFeatureLayer)功能,这是WebGIS开发中处理矢量数据、实现交互式地图的核心技术。矢量…

从“能说话”到“会做事”:AI Agent如何重构日常工作流?

从“能说话”到“会做事”:AI Agent如何重构日常工作流?在人工智能飞速发展的当下,AI已从最初简单的语音交互、信息检索进化到了具备自主决策与行动能力的新阶段,其中AI Agent的出现堪称关键转折点。从只能机械“说话”回答问题&a…

随身wifi到底有没有用?

不用绕弯子,直接说清随身WiFi怎么回事,对比完家用WiFi和手机热点,再避坑~一、先明白:随身WiFi到底是啥? 1、简单讲就是「能揣兜里的WiFi发射器」——要么插张物联卡,要么内置流量,能…

MySQL问题8

MySQL深度分页优化思路 常见的3种优化思路如下: 1. 子查询优化方式 示例改写前: SELECT * FROM words WHERE name oee ORDER BY id LIMIT 99999990, 10;这个写法会导致 MySQL 扫描并丢弃前面 99999990 行,效率极低。 示例改写后&#xff…

洛谷 P1249 最大乘积-普及/提高-

P1249 最大乘积 题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 312312312,413413413,514235142351423,615246152461524。 现在你的任务是将指定的正整数 nnn 分解成若干个互不相同的自然数(也可以不分解…

大学地理信息科学该如何学习才能好就业

一、明确专业特点与就业方向地理信息科学是一门交叉性强、实践性强的学科,融合了地理学、计算机科学、测绘、遥感等多个领域,广泛应用于自然资源管理、城市规划、交通、环境、农业、水利、智慧城市等行业。主要就业方向包括:政府部门/事业单位…

【git】Git 大文件推送失败问题及解决方案

Git 大文件推送失败问题及解决方案 在日常开发中,我们经常会遇到这样的问题: Remote: File [xxx.exe] size 188.156MB, exceeds quota 100MB Remote: Please remove the file[s] from history and try again这是因为 Gitee/GitHub 等平台对单个文件大小有…

国产银河麒麟三维数字沙盘大数据可视化研训推演模拟仿真地理信息系统

国产银河麒麟三维数字沙盘大数据可视化研训推演模拟仿真地理信息系统独立自主知识产权和原创源代码级地理信息系统平台,核心引擎与算法实现全栈国产化,提供从数据采集、处理到可视化分析的全链条自主可控解决方案, 1.2支持国产操作系统&…

GPT Server 文档

目录配置文件的详细说明(后续持续完善)openai_api_server配置控制器(controller)配置模型(worker)配置模型配置大语言模型 示例:QwenEmbedding模型 示例:Conan-embedding-v1TTS文本转语音模型 示例: Spark-TTST2I 文生图模型示例:…

中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开启ADB ROOT安卓固件-方法3

中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G32G_开启ADB ROOT安卓固件-方法3 声明,这个安卓固件root一旦恢复出厂设置,会变回原样,虽然root,但也无法自行操作。 建议按照:中国移动云电脑一体机-创维LB2004_瑞芯微…