MySQL之事务和锁机制

文章目录

  • 一、事务
    • 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的学习,先学习了事务的四大特征、隔离级别,如何开启事务。又学习了锁机制,认识了读写锁、行表锁、记录锁等。之后的学习内容将持续更新!!!

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

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

相关文章

leaflet实现波动的marker效果(131)

第131个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示波动的marker效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共76行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…

chatgpt 变现思路

教学 为用户提供ChatGPT的培训课程&#xff0c;教授如何使用和掌握ChatGPT的基本功能和高级技巧。课程可以通过在线平台或实体培训形式进行。 各种设计 ChatGPT可以为设计师提供创意灵感&#xff0c;包括平面设计、UI/UX设计、建筑设计等。此外&#xff0c;它还可以协助设计…

MySQL主从复制之多主多从部署流程—2023.04

文章目录一、多主多从实现架构图二、准备工作三、MySQL多主多从搭建流程1、修改2个主节点配置文件2、修改2个从节点配置文件3、2个主节点相互复制4、2个从节点分别复制主节点5、测试记录&#xff1a;一、多主多从实现架构图 这里是2主2从&#xff0c;下图基本例举出来的实现的…

电脑安装Ubuntu系统(非虚拟机)步骤简述

由于我的笔记本电脑比较古老&#xff08;近10年&#xff09;&#xff0c;已经过了质保期&#xff0c;甚至续保时间都过了&#xff0c;所以本着能用则用的想法就在上面改安装Ubuntu系统。下面简单介绍下安装过程&#xff0c;自己留笔记&#xff0c;如果有碰到同样问题的能参考更…

信息收集之WAF绕过

信息收集之WAF绕过前言一、工具进行目录扫描1. 工具的下载2. 工具的使用二、Python代码进行目录扫描前言 对于web安全无WAF的信息收集&#xff0c;大家可以查看如下链接的文章&#xff1a; web安全之信息收集 对于有WAF信息收集&#xff0c;看如下所示&#xff1a;&#xff08;…

opencv学习(二)图像阈值和平滑处理

图像阈值ret, dst cv2.threshold(src, thresh, maxval, type)src&#xff1a; 输入图&#xff0c;只能输入单通道图像&#xff0c;通常来说为灰度图dst&#xff1a; 输出图thresh&#xff1a; 阈值maxval&#xff1a; 当像素值超过了阈值&#xff08;或者小于阈值&#xff0c;…

(数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换

文章目录一&#xff1a;一维离散傅里叶变换&#xff08;1&#xff09;定义&#xff08;2&#xff09;实例二&#xff1a;一维快速傅里叶变换&#xff08;1&#xff09;定义&#xff08;2&#xff09;实例三&#xff1a;二维离散傅里叶变换&#xff08;1&#xff09;定义&#x…

Python入门教程+项目实战-7.4节: 程序实战-计算次大值

目录 7.2.1 计算四个中的次大值 7.2.2 使用循环计算次小值 7.2.3 系统学习python 7.2.1 计算四个中的次大值 假设有四个整型变量&#xff0c;该怎么计算四个中的次大值&#xff1f; 初学者解出这道题并不困难&#xff0c;但是将代码写得简洁优雅却是一个不小的挑战。 直接通…

aspnet016计算机组成原理精品课程shfw程序

2网站项目范围 计算机组成原理精品课程系统从两种用户角度进行功能划分。 1、学生部分&#xff1a; 1.1&#xff1a;新闻查看&#xff1b; 1.2&#xff1a;课程公告查看&#xff1b; 1.3&#xff1a;用户注册&#xff1b; 1.4&#xff1a;在线留言&#xff1b; 1.5&#xf…

Spring Boot 配置文件配置自动提示 Configuration Processor

效果 在使用Idea等开发工具时&#xff0c;配置文件中输入前缀就有对应的补全提示&#xff0c;使开发者可以很方便配置相应属性&#xff0c;效果截图如下&#xff1a; 元数据说明 这些提示来自于 spring 自动配置规范中的源数据文件 spring-configuration-metadata.json 和 ad…

百度储瑞松谈智能驾驶:极个别车厂才能做全栈自研

百度集团副总裁、智能汽车事业部总经理储瑞松在百人会论坛表示&#xff0c;汽车智能化系统不同于车企所熟悉的以金属件为主的车辆其他部分的系统&#xff0c;是一个以硬件为载体、由算法软件驱动的大规模动态系统&#xff0c;它的复杂性比起以金属件为主的系统是指数级增长的。…

【环境与工具】IDE配置——vscode配置

配置vscode的 Python , C 的编译环境 2. Python 2.1 Python解释器 2.1.1 安装python环境 2.1.2 创建vscode-python文件夹 裸配置 如图&#xff0c;与在命令行运行无区别 2.1.2 安装vscode-python插件 2.1.3 code插件运行.py 添加配置文件 program 设置启动文件 "progr…

多线程进阶学习12------ConcurrentHashMap详解

JDK 7 HashMap 并发死链 注意&#xff1a;要在 JDK 7 下运行&#xff0c;否则扩容机制和 hash 的计算方法都变了 import java.io.*; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.StringTokenizer; import java.util.concurrent.*; import java.…

AR”将会成为“更加日常化的移动设备应用的一部分”吗

目录 1&#xff1a;AR是什么 2&#xff1a;AR给人类带来的贡献 3&#xff1a;人们在生活中可以遇到许多 AR 技术应用 4&#xff1a;AR 技术的未来发展的趋势&#xff1a; 大学主攻VR&#xff0c;从大一就对VR的知识&#xff0c;设备&#xff0c;已经所涉及的知识伴随我的整…

AI工具(ChatGPT)常用指令,持续更新...

要国内使用AI工具&#xff0c;关注&#xff1a;码视野&#xff0c;回复&#xff1a;1002使用VensiGPT时&#xff0c;当你给的指令越精准&#xff0c;它回复就会越完美&#xff0c;例如&#xff0c;如果你要请它协助撰写文案&#xff0c;如果没有给与指定情景与目标&#xff0c;…

作为大学生,你还不会搭建chatGPT微应用吗?

目录 引言ChatGPT是什么&#xff1f;背景&#xff1a;ChatGPT敢为人先&#xff0c;打破全球僵局示例演示&#xff1a;基于ChatGPT微应用实现的条件及步骤&#xff08;1&#xff09;整体框架&#xff08;2&#xff09;搭建前的准备工作&#xff08;3&#xff09;实际搭建步骤&a…

文件或目录损坏怎么办?4个实用方法!

案例&#xff1a;文件或目录损坏怎么恢复&#xff1f; 【有谁知道为什么文件会突然无法打开且显示损坏了呀&#xff1f;我有一个很重要的文件无法打开了&#xff0c;之前从来没有遇到过这样的问题&#xff0c;这让我很无措&#xff0c;请大家帮我想想办法吧&#xff01;】 我…

ThreeJS-聚光等衰减(二十一)

聚光灯可以联系到现实中的手电筒 衰减分为&#xff1a;距离衰减和边缘衰减 .decay : Float&#xff08;控制的是灯光自身的亮度&#xff09; The amount the light dims along the distance of the light. Default is 2. In context of physically-correct rendering the defa…

pip lanms-neo报错问题

pip lanms-neo报错问题 安装Polygon3的时候&#xff0c;就遇到需要Microsoft Visual C 14.0的问题&#xff0c;以为通过本地whl安装&#xff0c;就能避免。结果&#xff0c;lanms-neo这个库&#xff0c;网上还不好找whl文件&#xff0c;找到的都是csdn里面的付费下载&#xff…

【Java8最优解】P1478 陶陶摘苹果(升级版)

陶陶摘苹果&#xff08;升级版&#xff09; 题目描述 又是一年秋季时&#xff0c;陶陶家的苹果树结了 nnn 个果子。陶陶又跑去摘苹果&#xff0c;这次他有一个 aaa 公分的椅子。当他手够不着时&#xff0c;他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的是&…