【SQL】InnoDB中的行锁

InnoDB 里的行锁机制主要通过索引来实现,而不是直接对表中的记录加锁。具体来说,InnoDB 使用以下几种锁定机制来实现行锁:

  1. 记录锁 (Record Lock):锁定单个索引记录。
  2. 间隙锁 (Gap Lock):锁定索引记录之间的间隙,防止其他事务在该间隙插入新记录。
  3. 临键锁 (Next-Key Lock):结合记录锁和间隙锁,锁定一个索引记录以及其前面的间隙。

行锁的实现

InnoDB 的行锁是通过对索引项加锁来实现的,这意味着只有通过索引访问数据,InnoDB 才能使用行级锁定。如果一个 SQL 语句不使用索引,InnoDB 会退化为表锁。

锁的类型

  • 共享锁 (S 锁):允许事务读取一条记录,但不允许修改。
  • 排他锁 (X 锁):不允许其他事务读取或修改一条记录。

示例

假设有一个 employees 表:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2)
) ENGINE=InnoDB;
使用 FOR UPDATE 加锁
BEGIN;
SELECT * FROM employees WHERE id = 1 FOR UPDATE;

该语句在 id = 1 的记录上加了一个排他锁 (X 锁)。由于 id 是主键,这是一个记录锁。

插入操作导致的间隙锁
BEGIN;
INSERT INTO employees (id, name, salary) VALUES (5, 'Alice', 5000);

插入操作会导致在相应索引上的间隙锁,以防止其他事务在相同间隙中插入记录。

使用共享锁
BEGIN;
SELECT * FROM employees WHERE salary > 4000 LOCK IN SHARE MODE;

该语句在符合条件的记录上加了共享锁 (S 锁),同时会在表上加意向共享锁 (IS 锁)。

Java 代码示例

假设你想通过 Java 代码来执行这些操作,可以使用 JDBC:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class InnoDBLockExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "yourusername";String password = "yourpassword";try (Connection conn = DriverManager.getConnection(url, user, password)) {// 开始事务conn.setAutoCommit(false);// 加锁查询String query = "SELECT * FROM employees WHERE id = ? FOR UPDATE";try (PreparedStatement pstmt = conn.prepareStatement(query)) {pstmt.setInt(1, 1);try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));}}}// 提交事务conn.commit();} catch (SQLException e) {e.printStackTrace();}}
}

该 Java 代码示例演示了如何使用 JDBC 来执行一个带有行锁的查询。首先,设置连接为手动提交模式,然后执行一个带有 FOR UPDATE 的查询以加锁。最后,提交事务。

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

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

相关文章

vue 自定义(hook)--(模块化)

文章目录 定义示例代码 定义 什么是hook?—— 本质是一个函数,把setup函数中使用的Composition API进行了封装,类似于vue2.x中的mixin。 自定义hook的优势:复用代码, 让setup中的逻辑更清楚易懂。 示例代码 useSum.ts中内容如下…

react学习——26redux实现求和案例(异步action)

1、安装redux-thunk npm install redux-thunk npm install redux-thunk2、redux/store.js 引入redux-thunk /*该文件专门用于创建一个为Count组件服务的store对象*/ //引入createStore,专门创建redux中最为核心的store对象 import {createStore,applyMiddleware} from redux …

Python:引号应用、字符串应用

# 把前面的引号理解为起始符,后面的理解为终止符 # 单双引号的灵活运用 想输出"hello,Q" 用单引号 # 想输出 This is Qs 用双引号 # 想输出既有单引号又有双引号或者特定格式 用三对单引号### word "hello,Q" word2 "This is Qs" …

mavlink协议解析

1. mavlink数据包格式 字节索引C 版本内容值说明0uint8_t magic数据包启动标记0xFE特定于协议的文本启动 (stx) 标记, 用于指示新数据包的开始。 任何不识别协议版本的系统都将跳过数据包。1uint8_t len载荷长度0 - 255指示以下 payload 部分的长度 (为特定消息固定)。2uint8_t…

java并发编程概述

java并发编程概述 一. 进程和线程的概念 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位。进程是程序运行的实例,每当操作系统在运行一个程序时,会为其创建一个进程。每个进程都拥有自己的一整套变量。…

python:openpyxl DataBarRule 制作数据条

技术文档: 条件格式 — openpyxl 3.0.7 文档 openpyxl.formatting.rule module — openpyxl 3.1.3 documentation 但是,想让单元格数值按比例显示(右边正确)只能按data_bar_rule_2编写: from openpyxl import Workb…

微服务中的 “客户端负载均衡” 简介

微服务中的客户端负载均衡是指将负载(即工作任务或访问请求)在客户端进行分配,以决定由哪个服务实例来处理这些请求。这种负载均衡方式与服务端负载均衡相对,后者是在服务端(如服务器或负载均衡器)进行请求…

系统设计题-路由表最长匹配

一、题目 路由表最长匹配:将目标IP地址dstIP与路由为entryIP/掩码长度m(比如10.166.50.0/23)进行匹配,找出匹配掩码m最长值。 匹配规则: 如果dstIP和entryIP的二进制表示的前m个位相同,则说明是匹配的。 0…

抖音必备工具!掌握萤瓴优选橱窗带货软件的五大优势,助你快速盈利

在当今数字化时代,抖音作为一款备受欢迎的短视频社交平台,不仅为人们提供了展示自我的舞台,更成为了众多商家和个人创业者推广产品和服务的重要渠道。然而,要在抖音上实现高效带货,并非易事。幸运的是,萤瓴…

技校专业群的生成机制研究

一、引言 随着我国经济的快速发展和产业结构的不断优化,技术型人才的需求日益旺盛。技工学校(简称技校)作为培养技术型人才的摇篮,其专业群的构建与发展显得尤为重要。专业群作为技校战略发展的核心,不仅能够优化教学…

Python 脚本编写指南:从框架到实践

一、引言 Python 作为一种强大且易于学习的编程语言,在各个领域都有着广泛的应用。编写 Python 脚本是实现各种功能和任务的常见方式。 二、Python 脚本框架的基本组成部分 导入必要的模块 在脚本的开头,我们通常需要导入所需的 Python 模块&#xff…

大模型之战进入新赛季,开始卷应用

最近一段时间,国产大模型Kimi彻底火了,而这波爆火,某种意义上也展示了一个问题,即大模型的落地场景可能比技术比拼,更重要。 国产大模型Kimi突然爆火,与Kimi相关的产业链甚至被冠上“Kimi概念股”之名&…

【初阶数据结构】树与二叉树:从零开始的奇幻之旅

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

day10:03 一文搞懂encode和encoding的区别

在Python中,处理字符串时经常会遇到encode()方法和encoding参数,它们都与字符串的编码和解码有关,但用途和上下文有所不同。下面通过案例来解释它们的关系和区别。 1. encode() 方法 encode()方法是字符串(str)类型的…

《简历宝典》08 - 简历中“教育背景”模块如何扬长避短

目录 1 本文概述 2 必须写的信息 3 学历的优势凸显 4 专业的重要性 5 如果所学专业与当前求职的职位不匹配 6 在校期间获得的奖项和证书 7 最后 1 本文概述 前两节我们把个人信息模块做了拆分讲解,分为必写的信息项和根据个人情况酌情添加的信息项&#xff0…

51单片机:如何使用串口波特率计算器及其详解

目录 一、如何使用串口波特率计算器 1.以此为例: 2.生成代码如下: 3.需要手动配置中断系统 1.原理图 2.配置代码 二、如何理解软件生成的波特率 1.以该代码为例子进行分析 2.串口模式图 三、如何计算波特率 参考STC89C52手册P235 四、如何调用串口中断函数 一、如何…

HBase 在统一内容平台业务的优化实践

作者:来自 vivo 互联网服务器团队-Leng Jianyu、Huang Haitao HBase是一款开源高可靠性、扩展性、高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBase的痛点展开,从四个方面对HBase的使用进行优化,取得了一些…

36. Adam 算法详解

Adam(Adaptive Moment Estimation)是一种结合动量法和自适应学习率的优化算法,自2014年提出以来,迅速成为深度学习中最流行和常用的优化算法之一。Adam算法的核心思想是利用梯度的一阶动量和二阶动量来动态调整学习率,…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(五)仿钉钉流程的json数据保存与显示

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、需要做一个界面保存与显示仿钉钉的流程,先建一个表,用online建 2、通过上面生成代码,放入到相应的前后端工程里 3、修改前端仿钉钉流程的设计功能&a…

spark基于Spark的对招聘信息的分析与设计-计算机毕业设计源码50716

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设计 3.1 系统架构设…