MySQL之事务和锁机制

news/2024/4/29 3:32:41/文章来源:https://blog.csdn.net/qq15035899256/article/details/130003231

文章目录

  • 一、事务
    • 1.1 事务特征
    • 1.2 隔离级别
    • 1.3 开启事务
  • 二、锁机制
    • 2.1 读锁、写锁
    • 2.2 全局锁、表锁、行锁
    • 2.3 记录锁、间隙锁、临键锁


提示:以下是本篇文章正文内容,MySQL 系列学习将会持续更新

在这里插入图片描述

一、事务

  • 在数据库里面,我们希望有些操作能够以原子的方式进行,要么都能执行成功,要么就都不执行,也就是只能是一个整体的被执行,这样的一组具有原子性的操作我们就称之为事务
  • 我们的 MySQL 支持 9 种数据库引擎,但只有默认的 Innodb 引擎支持事务功能。

1.1 事务特征

  • 原子性 (atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性 (consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
  • 隔离性 (isolation):当多个事务对同一资源同时操作时,一个事务的执行不能被其他事务干扰。这里的同时只是宏观上的表现,实际上也就是微观上同一时刻只有一个事务在执行,而其它事务是在等待中。
  • 持久性 (durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,即便系统故障也不会丢失。

1.2 隔离级别

更追求隔离性(数据更正确)-------------------------------------------------------------------------------------------------------------->更追求并发性(性能更高)
(可串行性)
serializable
(快照读)
snapshot_read
(可重复读)
repeatable_read
(读已提交)
read_committed
(读未提交)
read_uncommitted

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。



不是标准中存在的隔离级别,目前来说,没有副作用。
MySQL中的可重复读就是实际上的快照读。因为MVCC机制解决了幻读


这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这会导致幻读当用户修改某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有一条未修改的数据“幻影”只能读取其它事务已经提交的内容,存在不可重复读问题:一个事务多次读取同一数据可能会得到多个不同的结果



能够读取到其它事务中未提交的内容,存在脏读问题。读取未提交的数据,也被称之为脏读




我们可以修改隔离级别:

set session transaction isolation level read uncommitted;

回到目录…

1.3 开启事务

①SQL开启事务

-- 开启事务
start transaction; / begin;
SQL1;
SQL2;
rollback; -- 主动回滚-- 开启事务
start transaction; / begin;
SQL1;
SQL2;
SQL3;
commit; -- 提交事务,失败也会回滚

②JDBC使用事务

// 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
try (Connection c = DBUtil.connection()) {// connection 中有一个自动提交(autocommit)的属性,默认情况下是 true(开启)// 开启状态下,意味着,每一条 sql 都会被独立的视为一个事务// 我们要让 sql1 和 sql2 看作整体,只需要关闭 connection 的自动提交c.setAutoCommit(false);// 此时就可以手动的控制事务的结束位置,并且需要手动提交try (PreparedStatement ps = c.prepareStatement(sql1)) {ps.executeUpdate();}try (PreparedStatement ps = c.prepareStatement(sql2)) {ps.executeUpdate();}// 由于我们关闭了自动提交了,所以,所有的修改还没有真正地落盘c.commit();     // 只有加上这句话,才表示事务被提交了(数据真正落盘了)
}

回到目录…

二、锁机制

我们知道在可重复读的级别下,MySQL 在一定程度上解决了幻读问题:

  • 在快照读(不加锁)读情况下,mysql 通过 MVCC (多版本并发控制) 来避免幻读。
  • 在当前读(加锁)读情况下,mysql 通过 next-key 来避免幻读。

2.1 读锁、写锁

从对数据的操作类型上来说,锁分为读锁和写锁:

  • 读锁:也叫共享锁,当一个事务添加了读锁后,其他的事务也可以添加读锁或是读取数据,但是不能进行写操作,只能等到所有的读锁全部释放。
  • 写锁:也叫排他锁,当一个事务添加了写锁后,其他事务不能读不能写也不能添加任何锁,只能等待当前事务释放锁。

2.2 全局锁、表锁、行锁

从锁的作用范围上划分,分为全局锁、表锁和行锁:

全局锁:锁作用于全局,整个数据库的所有操作全部受到锁限制。

flush tables with read lock;

表锁:锁作用于整个表,所有对表的操作都会收到锁限制。

lock table 表名称 read; -- 读锁
lock table 表名称 write; -- 写锁-- 除了手动释放锁之外,当我们的会话结束后,锁也会被自动释放。
unlock tables;

行锁:锁作用于表中的某一行,只会通过锁限制对某一行的操作(仅InnoDB支持)

-- 添加读锁(共享锁)
select * from 表名 where ... lock in share mode;
-- 添加写锁(排他锁)
select * from 表名 where ... for update;

回到目录…

2.3 记录锁、间隙锁、临键锁

我们知道 InnoDB 支持使用行锁,但是行锁比较复杂,它可以继续分为多个类型,详细可查看文章:MySQL的锁机制 - 记录锁、间隙锁、临键锁

记录锁(Record Locks): 仅仅锁住索引记录的一行,在单条索引记录上加锁。Record lock 锁住的永远是索引,而非记录本身。所以说当一条 sql 没有走任何索引时,那么将会在每一条聚合索引后面加写锁,这个类似于表锁,但原理上和表锁应该是完全不同的。

  • id 列必须为唯一索引列或主键列,否则加的锁就会变成临键锁。
  • 同时,查询语句必须为精准匹配(=),不能为 >、<、like等,否则也会退化成临键锁。

间隙锁(Gap Locks): 仅仅锁住一个索引区间(开区间)。在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。比如在 1、2 中,间隙锁的可能值有 (-∞, 1),(1, 2),(2, +∞),间隙锁可用于防止幻读,保证索引间的不会被插入数据。

  • 对于主键索引:精准查询存在列,只会产生记录锁;精准查询不存在列,会产生记录锁和间隙锁;范围查询会产生间隙锁。
  • 对于普通索引:不管是何种查询,只要加锁,都会产生间隙锁。
    在这里插入图片描述

临键锁(Next-Key Locks): Record lock + Gap lock左开右闭区间。默认情况下,InnoDB 正是使用 Next-key Locks 来锁定记录(如select … for update)。

它还会根据场景进行灵活变换:

场景转换
使用唯一索引进行精确匹配,但表中不存在记录自动转换为 Gap Locks
使用唯一索引进行精确匹配,且表中存在记录自动转换为 Record Locks
使用非唯一索引进行精确匹配不转换
使用唯一索引进行范围匹配不转换,但是只锁上界,不锁下界

回到目录…


总结:
提示:这里对文章进行总结:
本文是MySQL的学习,先学习了事务的四大特征、隔离级别,如何开启事务。又学习了锁机制,认识了读写锁、行表锁、记录锁等。之后的学习内容将持续更新!!!

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

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

相关文章

CSS模块的书写以及删除线的作用和来历什么是删除线

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>/*关羽这一行代码变为绿色*/#gy_li{color: green}/*张飞,苹果这一行代码变为黄色*/#zf_li,#pg_ul{color: yellow}/*i…

华为OD机试题 Q2 押题【贪心的商人 or 最大利润】用 C++ 编码,速通

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:贪心的商人 or 最大利润 题目…

GEE:数据结构——Object 对象(创建、访问、修改、删除、遍历)

在Google Earth Engine (GEE) 平台中&#xff0c;“Object” 是指一种数据结构&#xff0c;它是由一组属性&#xff08;键-值对&#xff09;&#xff08;key-value&#xff09;组成的&#xff0c;可以是数字、字符串、布尔值、数组或其他对象。 在 GEE 中&#xff0c;许多数据…

实战:向人工智能看齐用Docker部署一个ChatGPT

文章目录前言鉴赏chatgpt环境要求开始搭建云安装docker从docker仓库拉取chatgpt-web镜像创建容器并运行chatgpt-web创建容器启动chatgpt-web访问自己的chatgpt总结前言 目前GPT-4都官宣步入多模态大型语言模型领域了&#xff0c;大佬竟然还没有体验GPT么。作为一个资深搬砖人士…

【C++修行之路】面向对象三大特性之多态

文章目录前言认识多态构成多态的必要条件虚函数的重写虚函数重写的两个例外final和override重载、覆盖、隐藏抽象类多态的原理单继承多继承重写了基类的虚函数没有重写基类的虚函数菱形继承和菱形虚拟继承的虚表补充补充继承与多态相关问题inline函数可以是虚函数吗&#xff1f…

2.半导体二极管

1.半导体二极管二极管的组成二极管和PN结伏安特性的区别二极管的伏安特性及电流方程为什么反向饱和电流越小&#xff0c;单向导电性能越强。二极管的等效电路二极管的主要参数稳压二极管&#xff08;又称齐纳二极管或反向击穿二极管&#xff09;稳压二极管与普通二极管的区别其…

深入理解MCU启动原理

前面写了一篇 STM32的完整启动流程分析&#xff0c;但是感觉有些地方没有完全理明白&#xff0c;因此对不清楚的地方又做了一些总结。 1. MCU最开始一启动后去哪里读代码&#xff1f; CPU上电启动后被设计为去地址0x00000000位置处读取代码&#xff1b;首先会连续读取两个字&…

Linux ELK日志分析系统 | logstash日志收集 | elasticsearch 搜索引擎 | kibana 可视化平台 | 架构搭建 | 超详细

Linux ELK日志分析系统 | logstash日志收集 | elasticsearch 搜索引擎 | kibana 可视化平台 | 架构搭建 | 超详细ELK 日志分析系统1.日志服务器2.ELK 日志分析系统3 日志处理步骤一、 Elasticsearch 介绍1.1概述1.2核心概念二、Kibana 介绍三 ELK架构搭建3.1 配置要求3.2 安装 …

Java中Stream的应用

Stream简介 Java 8 版本新增的Stream&#xff0c;配合同版本出现的Lambda &#xff0c;给我们操作集合&#xff08;Collection&#xff09;提供了极大的便利。 Stream可以由数组或集合创建&#xff0c;对流的操作分为两种&#xff1a; 中间操作&#xff1a;每次返回一个新的…

DALL·E:OpenAI第一代文本生成图片模型

1 简介 本文根据openAI 2021年2月的《Zero-Shot Text-to-Image Generation》翻译总结的。原文详见https://arxiv.org/pdf/2102.12092v1.pdf。 DALLE : 论文中没看到这个名字&#xff0c;可能是后起的吧。 DALLE有120亿参数&#xff0c;基于自回归transformer&#xff0c;在2…

Spring 01 -项目管理框架Spring入门

本部分理解原理就好 Spring入门1 Spring引入1.1 原生web开发中存在的问题2 Spring2.1 Spring的概念2.2 Spring 作用2.3 Spring的组成2.4 spring的IOC底层实现原理3 Spring快速入门3.1 引入spring依赖3.2 spring的配置文件3.3 测试四、Spring的开发细节4.1 BeanFactory的类间关系…

android的system_server进程的启动

android的system_server进程的启动 android的system_server进程的启动的简单介绍 system_server是Zygote的fork的第一个Java进程相当于它的大儿子&#xff0c;这个进程非常重要的&#xff0c;这里这个进程提供了很多系统线程&#xff0c;提供了所有的核心的系统服务。比如&am…

mysql与redis区别

一、.redis和mysql的区别总结 &#xff08;1&#xff09;类型上 从类型上来说&#xff0c;mysql是关系型数据库&#xff0c;redis是缓存数据库 &#xff08;2&#xff09;作用上 mysql用于持久化的存储数据到硬盘&#xff0c;功能强大&#xff0c;但是速度较慢 redis用于存储使…

SQL基础查选和条件查选

写完毕业论文&#xff0c;终于有空复习sql了&#xff0c;继续学习之旅~下次不能和上次一样&#xff0c;简单的sql语句都忘记了。 1.查询结果去重 关键字 distinct select distinct university from user_profile; 2. 将查询后的列重新命名 关键字 as 关键字limit…

Linux kernel 编译 exfat.ko ntfs.ko 来支持exFat 和 NTFS 分区

项目需求想让设备支持 exFat 和 NTFS 的文件格式. 默认的内核是不支持的,因为内核要限定1.5M之内, 所以很多东西都裁剪掉了. 而且不是所有项目都有这个需求,所以就需要编译为 ko ,按需加载; 而不是才去built-in的方式. 在如下的选项找到对应的配置. 至于如何找到, 我推荐2种方式…

LE AUDIO快速了解

有BIS和CIS两种 BIS是广播的&#xff0c;不需要连接&#xff0c;只需要监听 CIS要建立连接的&#xff0c;除了ACL链路&#xff0c;还需要建立CIS链路 BIS部分 也没啥要看的&#xff0c;只需要记住3个指令就可以了 主要是HCI的3个指令 2068 206b 206e 这3个指令即可 206…

Nacos安全性探究

Nacos怎么做安全校验的&#xff1f; 以下使用nacos2.x 如上图所示&#xff0c; 可以直接访问Nacos的接口来获取用户列表。这说明Nacos的接口被爆露&#xff0c;任何情况下都可以访问&#xff0c;因此安全性得不到保障。 Nacos 使用 spring security 作为安全框架。spring sec…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取每张图像的微秒时间和FrameID(C#)

BGAPI SDK获取图像微秒级时间和FrameID Baumer工业相机Baumer工业相机FrameID技术背景一、FrameID是什么&#xff1f;二、使用BGAPI SDK获取图像微秒时间和FrameID步骤 1.获取SDK图像微秒级时间2.获取SDK图像FrameIDBaumer工业相机使用微秒级时间和FrameID保存的用处Baumer工业…

混淆矩阵Confusion Matrix(resnet34 基于 CIFAR10)

目录 1. Confusion Matrix 2. 其他的性能指标 3. example 4. 代码实现混淆矩阵 5. 测试&#xff0c;计算混淆矩阵 6. show 7. 代码 1. Confusion Matrix 混淆矩阵可以将真实标签和预测标签的结果以矩阵的形式表示出来&#xff0c;相比于之前计算的正确率acc更加的直观…

jenkins打包发布前端项目

1.配置前端nodejs打包环境 1.1安装nodejs插件 1.2配置jenkins nodejs环境 2.下载git插件(使用此插件配置通过gitlab标签拉取项目) 3.创建一个自由风格的发布项目 4.配置项目构建流程 4.1添加钉钉告警 4.2配置参数化构建 4.3配置源码管理为git拉取项目 4.4配置构建环境 4.5配置…