(十二)MySQL学习笔记——锁机制

深入解析MySQL事务机制和锁机制 MySQL的事务机制和锁机制是确保数据一致性和完整性的基础。通过深入理解并合理应用这些机制,可以显著提高数据库的并发处理能力和稳定性。希望本文能够帮助读者更好地掌握MySQL的事务机制和锁机制,为实际开发和运维提供有价值的参考。如果你对MySQL的事务和锁机制有更多的问题或经验分享,欢迎在评论区讨论! 阅读详情

一、锁的分类

  • 按操作分类:
    • 共享锁:也叫读锁。针对同一份数据,多个事务读取操作可以同时加锁而不互相影响 ,但是不能修改数据记录。
    • 排他锁:也叫写锁。当前的操作没有完成前,会阻断其他操作的读取和写入
  • 按粒度分类:
    • 表级锁:操作时,会锁定整个表。开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低。偏向于MyISAM存储引擎!
    • 行级锁:操作时,会锁定当前操作行。开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。偏向于InnoDB存储引擎!
    • 页级锁:锁的粒度、发生冲突的概率和加锁的开销介于表锁和行锁之间,会出现死锁,并发性能一般。
  • 按使用方式分类:
    • 悲观锁:每次查询数据时都认为别人会修改,所以每次查询时都加锁。
    • 乐观锁:每次查询数据时都认为别人不会修改,更新时会判断一下在此期间别人有没有去更新这个数据,无则更新数据,有则放弃。

不同存储引擎支持的锁:

存储引擎表级锁行级锁页级锁
MyISAM支持不支持不支持
InnoDB支持支持不支持
MEMORY支持不支持不支持
BDB支持不支持支持

二、InnoDB锁

0.数据准备

-- 锁机制

-- InnoDB的锁机制
-- 数据准备
-- 创建db12数据库
CREATE DATABASE db12;

-- 使用db12数据库
USE db12;

-- 创建student表
CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	age INT,
	score INT
);
-- 添加数据
INSERT INTO student VALUES (NULL,'张三',23,99),
                           (NULL,'李四',24,95),
                           (NULL,'王五',25,98),
                           (NULL,'赵六',26,97);
SELECT * FROM student;   

1.创建共享锁

START TRANSACTION; -- 每次执行语句前,事务1和2同时开启事务。

-- 事务1 查询id=1的数据并加入共享锁
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;

-- 事务2 只查询id=1的数据,可以查到
SELECT * FROM student WHERE id=1;

-- 事务2 查询id=1的数据并加入共享锁,也可以查到
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;

-- 事务2 修改id=1的数据,此时卡死,只有事务1提交后,事务2的此语句才能执行成功。
-- 此时事务2还未提交,因此事务1查不到修改后的结果。
UPDATE student SET name='大张' WHERE id=1;

-- 事务2 修改id=2的数据修改成功,因为InnoDB默认是行锁。
UPDATE student SET name='大李' WHERE id=2;

-- 查询score=99的数据并加入共享锁
SELECT * FROM student WHERE score=99 LOCK IN SHARE MODE;
-- 此时事务2 修改id=3的数据不成功,因为InnoDB如果不采用带索引的列加锁,则加的是表锁。事务1提交后,事务2才能修改成功。
UPDATE student SET name='大孙' WHERE id=3;
COMMIT;

2.创建排他锁

-- 创建排他锁,加锁的数据不能被其他事务查询或修改
START TRANSACTION; -- 每次执行语句前,事务1和2同时开启事务。
-- 事务1查询id=1的数据并加入排他锁
SELECT * FROM student WHERE id=1 FOR UPDATE;

-- 事务2此时正常查询可以查到结果
SELECT * FROM student WHERE id=1;

-- 事务2查询id=1的数据并加入共享锁,会卡死
SELECT * FROM student WHERE id=1 FOR SHARE;

-- 事务1提交后,事务2立马查到结果。因此,排他锁和共享锁不兼容。
-- 另外,排他锁和排他锁也不兼容。
COMMIT;

三、MyISAM锁

MyISAM只能加表锁,不能加行锁,且不支持事务。

0.数据准备

-- 数据准备
-- 创建product表
CREATE TABLE product(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	price INT
)ENGINE = MYISAM;  -- 指定存储引擎为MyISAM

-- 添加数据
INSERT INTO product VALUES (NULL,'华为手机',4999),
                           (NULL,'小米手机',2999),
                           (NULL,'苹果',8999),
                           (NULL,'中兴',1999);
SELECT * FROM product;

1.读锁

所有连接只能查询数据,不能修改。

-- 给product表添加读锁
LOCK TABLES product READ;

-- 窗口1查询id=1的数据
SELECT * FROM product WHERE id=1;

-- 窗口2可以正常查询数据
SELECT * FROM product WHERE id=1;
-- 窗口2修改数据会卡死。加锁后不管哪个窗口,都不能修改数据,只能读取。
UPDATE product SET price=999 WHERE id=1;

UNLOCK TABLES;-- 窗口1解锁后,窗口2修改成功

2.写锁

其他连接不能查询、修改数据,只有本连接可以。

-- 写锁
LOCK TABLES product WRITE;

-- 当前连接可以查询
SELECT * FROM product;
-- 当前连接也可以修改
UPDATE product SET price=99 WHERE id=2;

-- 另一连接窗口查询和修改数据都会卡死,直到连接窗口1解锁。
UNLOCK TABLES;

四、悲观锁、乐观锁

1.悲观锁

  • 悲观锁:整个数据处理中需要将数据加锁。行锁,表锁不论是读写锁都是悲观锁。

2.乐观锁

  • 乐观锁:在更新的时候会去判断在此期间数据有没有被修改,需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。

2.1 版本号机制

  • 给数据表中添加一个version列,每次更新后都将这个列的值加1。
  • 读取数据时,将版本号读取出来,在执行更新的时候,比较版本号。
  • 如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。
  • 用户自行根据这个通知来决定怎么处理,比如重新开始一遍,或者放弃本次更新。

数据准备:

- 创建city表
CREATE TABLE city(
	id INT PRIMARY KEY AUTO_INCREMENT,  -- 城市id
	NAME VARCHAR(20),                   -- 城市名称
	VERSION INT                         -- 版本号
);

-- 添加数据
INSERT INTO city VALUES (NULL,'北京',1),
                        (NULL,'上海',1),
                        (NULL,'广州',1),
                        (NULL,'深圳',1);

现在要修改北京为北京市:

-- 1.查询北京的version
SELECT VERSION FROM city WHERE NAME='北京';
-- 2.修改北京为北京市,版本号+1。并对比版本号
UPDATE city SET NAME='北京市',VERSION=VERSION+1 WHERE name='北京' AND VERSION=1;

2.2 时间戳机制

  • 和版本号方式基本一样,给数据表中添加一个列,名称无所谓,数据类型需要是timestamp
  • 每次更新后都将最新时间插入到此列。
  • 读取数据时,将时间读取出来,在执行更新的时候,比较时间。
  • 如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。

2.3 CAS(Compare And Swap)机制

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码) 微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意, 阅读详情

相关推荐

Unity布娃娃系统 Ragdoll Mecanim Mixer使用

6. 选完之后,左键下面的hip等角色各个部位不松开鼠标,拖拽连接到上面Amature的各个部位,如图,下面所有部位都连接完之后,第二步点击Configure Selected Bones确认你的部位连接选择。要做一个布娃娃和动画混合的项目,这个插件是比较不错的,搜了一圈文章教程也是抄来抄去,抄的没有头没有尾,自己摸索着用了一下,记录使用过程吧。8. 之后就点击步骤7图一中的Create Ragdoll,会发现player结构发生变化,如图。4. 添加完脚本之后会显示你的player结构,如图。

SuShengQuanshiW的博客 1649

mysql lock write_MySQL_写锁_lock tables tableName write

pre.环境准备1.建立两个表S,T,并插入一些数据--创建表Screate table S(d int) engine=innodb;insert into S values (3);--创建表Tcreate table T(c int) engine=innodb;insert into S values (10);2.打开两个客户端连接一.写锁1.对锁定表进行查看,修改在session1中对...

weixin_35934012的博客 2442

基于STM32的工业I/O模块硬件电路实现

深入解析基于STM32的工业I/O模块硬件电路实现,涵盖关键电路设计与信号处理,突出硬件电路稳定性和工业级可靠性,适合嵌入式开发者参考。

weixin_35835018的博客 453

MySQL的lock tables和unlock tables的用法

早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定。但是具体如何用,怎么用,不太清楚。今天详细研究了下,总算搞明白了2者的用法。lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另外一种是写锁定,用命令lock...

红尘道,红尘练心 997

时间序列学习(4):平稳性检验(单位根检验、ADF检验)

时间序列学习(4):平稳性检验(单位根检验、ADF检验)1、单位根检验2、ADF检验3、指数走势的检验4、对数收益率序列检验 相关图可以大致判断序列是否平稳。但是,这毕竟不是严格的。 这篇笔记来就谈一谈平稳性的检验。 到目前为止,我们有了以下的时间序列模型: 白噪声; 随机游走; AR模型; MA模型; ARMA模型。 我们知道白噪声、MA模型一定是平稳的(这里的平稳都是弱平稳);随机游走一定是不平稳的;ARMA模型取决于其AR部分。 所以唯一需要做平稳性检验的就是AR模型。 1、单位根检验 先来看一阶

lucialucia的博客 7万+

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3952

mysql中lock tables与unlock tables(锁表/解锁)使用总结

先说结论: LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。 如果一个线程获得在一个表上的一个READ锁,该线程和所有其他线程只能从表中读。 如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。 正文: php mysql lock tables 使用有感 mysql 的 表锁 lock ta.

HD243608836的博客 1万+

量子计算入门指南:密度算符的核心概念与应用解析

本文深入解析了量子计算中密度算符的核心概念与应用。作为描述量子系统“状态的状态”的关键数学工具,密度算符能有效处理混合态与子系统描述,是理解量子噪声、量子纠错和开放系统演化的基石。文章通过对比纯态与混合态,阐释了密度矩阵的数学定义与物理意义,并结合代码示例演示了其在实际量子计算问题中的强大威力。

day7的博客 469

Linux下的服务器和客户端、会话

screen screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用screen服务程序同时在多个远程会话中自由切换,能够做到实现如下功能。 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。 会话共享:当多个用户同时登录到远程服务器时,便可以

A147254的博客 599

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践

本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 215

运放单电源供电和双电源供电的实际应用案例

文章摘要:本文对比分析了运放单电源与双电源供电的典型应用场景及电路设计要点。单电源供电适用于低成本、小体积设备,如便携音箱(5V供电+中点偏置)、工业4-20mA信号转换(12V供电+电压跟随)和物联网传感器(3.3V低功耗设计);双电源供电则适合高精度要求场景,如Hi-Fi音响(±15V对称输出)、医疗设备(±5V微弱信号放大)和精密仪器(±15V宽动态范围)。文末提供常见运放选型对照表,涵盖LM324、TL082等型号的供电参数与核心特性,为不同应用场景提供选型参考。(149字)

qq_37999850的博客 608

mysql中lock_关于 MySQL中lock tables和unlock tables

LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...UNLOCK TABLESLOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获...

weixin_33121737的博客 619

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

【Matlab光伏功率预测】基于GRU门控循环单元的光伏功率时间序列预测(附MATLAB代码)

k8291121的博客 1099

【数据库】MySQL 中的锁机制

数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。...

Data · Model · Agent · Repeat 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL 锁机制

本文从加锁粒度、模式、方式三方面系统分类,重点剖析 InnoDB 存储引擎下的行级锁(记录锁、间隙锁、临键锁)及其在 REPEATABLE READ 隔离级别中防止幻读的实现原理。此外,详解了意向锁、死锁产生与检测机制、锁兼容矩阵,并对 MyISAM 与 InnoDB 的锁策略进行对比分析。文章末附实用监控命令与开发优化建议,并配备常考锁机制练习题及答案,帮助读者理论结合实战,全面掌握锁的使用场景与风险控制策略。

专注于 Agent 工程、AI 产品、Harness Engineering、LLM 算法等方向,OpenMathModel、Nivik 等开源项目作者 3万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL 事务与锁机制详解

MySQL 的事务与锁机制共同构成了数据库并发控制的核心,通过遵循 ACID 原则和合理设置事务隔离级别,可以有效地保障数据的一致性和完整性。同时,了解和运用行级锁、表级锁以及意向锁等机制,对于开发者在高并发场景下优化性能至关重要。本文将从事务的基本概念、ACID 特性、事务隔离级别以及 MySQL 中的锁机制进行详细介绍,帮助开发者在实际应用中更好地设计和优化数据库操作。对关键业务逻辑进行压力测试,确保在高并发环境下事务和锁机制能正常工作,避免出现性能瓶颈。

男Ren、麦根的博客 2561

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【MySQL系列】- MYSQL锁机制

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面带来了性能损耗可能比表锁会更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表锁的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势但是,InnoDB的行级锁同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁合理设计索引,尽量缩小锁的范围。

记录总结工作过往 1326

MySQL 锁机制详解

表级锁、行锁、意向锁、共享锁、排他锁、死锁

Bbb36921的博客 1503

MySQL锁机制

在这里用到MySQL的锁,本篇文章来讲下MySQL的锁机制,了解锁的种类及实现原理。锁场景问题全局锁全库逻辑备份。

weixin_43844718的博客 2501

mysql的锁机制

1.MySQL锁的基本介绍2.表级锁与行级锁的区别?3.MyISAM表锁4.MyISAM写锁阻塞读的案例5.MyISAM读阻塞写的案例6.MyISAM的并发插入问题? 7.事务及其ACID属性8.并发事务带来的问题9.InnoDB的行锁模式及加锁方法10.InnoDB行锁实现方式11.总结 MyISAM写锁阻塞读的案例: 当一个线程获得对一个表的写锁之后,只有持有锁的线程可以对表进行更新操作。其他线程的读写操作都会等待,直到锁释放为止。 Session1Session2获取

ggdgvibe的博客 1957

超全MySQL锁机制介绍

了解MySQL中的锁机制对于数据库管理员和开发人员来说至关重要,它能帮助我们更好地控制并发访问,确保数据的一致性和完整性。通过合理使用不同的锁类型,我们可以提高系统的并发性能,减少锁冲突和死锁等问题。在实际应用中,需要根据具体的业务场景和需求选择合适的锁策略,并关注可能出现的问题,采取相应的优化措施。

weixin_40381772的博客 2279

MySQL-锁机制

MySQL-锁机制

XZB119211的博客 1455

MySQL的锁机制

MySQL锁机制是保证数据一致性的关键技术,主要包括表锁和行锁两种粒度。表锁开销小但并发度低,行锁开销大但并发度高。按照功能可分为共享锁(读锁)和排他锁(写锁)。InnoDB特有的行锁包括记录锁、间隙锁和临键锁,用于解决幻读问题。此外还有意向锁、自增锁等特殊锁类型。不同隔离级别采用不同的锁策略,大厂更倾向使用读已提交(RC)而非可重复读(RR),因为RC并发性能更好,且幻读问题可通过应用层优化解决。锁优化需关注死锁、锁升级和长事务等问题。

2301_76928097的博客 888

Mysql 数据库的锁机制分析

文章目录Mysql 数据库的锁机制分析一、问题背景1. 为什么要加锁?2.要解决的问题二、锁是什么三、锁的分类1.行级锁2.表级锁3.页级锁四、MySQL常用存储引擎的锁机制1. **`MyISAM`和`MEMORY`采用表级锁(table-level locking)**2. **`BDB`采用页面锁(page-level locking)或表级锁,默认为页面锁**3. **`InnoDB`支持...

AggressionStorm的博客 27万+

Mysql存储引擎、锁机制

MYSQL存储引擎、锁机制

hello world 1235
上一篇: (十一)MySQL学习笔记——索引
下一篇: (一)MySQL学习笔记——MySQL、可视化工具的安装
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值